🚀 Django 프로젝트 GitHub Actions CI/CD 구축 시 문제 해결기 (with PostgreSQL, Redis)

2025. 6. 11. 17:18·프로젝트

🚀 Django 프로젝트 GitHub Actions CI/CD 구축 시 문제 해결기 (with PostgreSQL, Redis)

 

최근 Django 프로젝트의 지속적 통합(CI)을 구축하면서 GitHub Actions를 사용하여 다양한 이슈를 겪었습니다. 특히 PostgreSQL, Redis와 함께 구성할 때 겪은 문제점들과 그 해결과정을 상세히 기록해봅니다.

📌 초기 상황과 문제

처음 Docker Compose를 이용해 프로젝트를 CI에서 띄우려 했으나 다양한 문제가 발생했습니다.

주요 오류 메시지들은 다음과 같았습니다.

  • SECRET_KEY 문제
     
django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
  • Docker Compose 서비스 문제
service "my-django" is not running
  • Docker healthcheck 플래그 오류
unknown shorthand flag: 'U' in -U

이로 인해 워크플로우가 정상 작동하지 않고 계속 실패했습니다.


🔍 문제의 원인 분석

문제 원인을 단계별로 분석했습니다.

1️⃣ 환경변수 미설정 문제 (SECRET_KEY가 비어있음)

  • Django의 환경변수를 .env 파일로 관리했지만 GitHub Actions에서는 별도의 .env파일이 없었기에 환경변수가 정상 로드되지 못함
  • .env가 CI 환경에 없어서 Django가 실행할 때 SECRET_KEY가 비어있음

2️⃣ Docker Compose의 한계점

  • docker compose exec/run을 사용하는 경우 컨테이너가 제대로 올라오지 않으면 이후 명령이 실패함
  • 환경변수 로딩이 제대로 이루어지지 않음 (특히 env_file 자동 로딩 불가능)

3️⃣ Docker healthcheck 설정 오류

  • Docker 명령어에서 healthcheck 명령(pg_isready -U) 옵션이 오해되어 Docker가 플래그로 인식하면서 오류가 발생함

✅ 문제 해결 방법 (단계별)

1️⃣ Docker Compose 제거 및 GitHub Actions 서비스 직접 사용하기

Docker Compose 없이 GitHub Actions의 내장 서비스(services:)를 직접 이용해 PostgreSQL과 Redis를 띄웠습니다. (간단하고 안정적)

2️⃣ .env 파일을 워크플로우에서 직접 생성하기

CI에서 .env 파일을 직접 생성해 환경변수를 주입했습니다.

- name: Create .env
  run: |
    cat <<EOF > .env
    SECRET_KEY=${{ secrets.SECRET_KEY }}
    DJANGO_ENV=development
    DB_NAME=${{ secrets.PG_NAME }}
    DB_USER=${{ secrets.PG_USER }}
    DB_PASSWORD=${{ secrets.PG_PASSWORD }}
    DB_HOST=localhost
    DB_PORT=5432
    REDIS_HOST=localhost
    REDIS_PORT=6379
    EOF

3️⃣ Django의 커스텀 명령어(wait_for_db)로 DB 연결 확인

Django 프로젝트에 미리 만들어 둔 커스텀 명령어를 사용하여 PostgreSQL이 준비될 때까지 기다리게 했습니다.

- name: Wait for database
  run: python manage.py wait_for_db

🎯 최종 해결된 GitHub Actions 워크플로우 코드 전체

아래가 최종적으로 성공한 전체 CI/CD 워크플로우 코드입니다.

.github/workflows/checks.yml

name: Code Quality Checks

on:
  push:
    branches:
      - '**'
  pull_request:

jobs:
  ci:
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:14
        env:
          POSTGRES_USER: ${{ secrets.PG_USER }}
          POSTGRES_PASSWORD: ${{ secrets.PG_PASSWORD }}
          POSTGRES_DB: ${{ secrets.PG_NAME }}
        ports:
          - 5432:5432

      redis:
        image: redis:7
        ports:
          - 6379:6379

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.12'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
          pip install black isort

      - name: Create .env
        run: |
          cat <<EOF > .env
          SECRET_KEY=${{ secrets.SECRET_KEY }}
          DJANGO_ENV=development
          DB_NAME=${{ secrets.PG_NAME }}
          DB_USER=${{ secrets.PG_USER }}
          DB_PASSWORD=${{ secrets.PG_PASSWORD }}
          DB_HOST=localhost
          DB_PORT=5432
          REDIS_HOST=localhost
          REDIS_PORT=6379
          EOF

      - name: Run isort (import sorting)
        run: isort . --check --diff

      - name: Run black (code formatting)
        run: black . --check

      - name: Wait for database
        run: python manage.py wait_for_db

      - name: Apply migrations
        run: |
          python manage.py makemigrations --noinput
          python manage.py migrate --noinput

      - name: Run tests
        run: python manage.py test

      - name: Cleanup services
        if: always()
        run: docker compose down --volumes --remove-orphans

🛠️ 해결 후 깨달은 교훈

  • GitHub Actions의 서비스 활용은 Docker Compose보다 더 쉽고 효율적임
  • .env 환경변수를 CI 환경에서도 명시적으로 주입하는 것이 중요함
  • 커스텀 명령어(wait_for_db)를 통해 안정적인 DB 연결 확인 가능

✨ 마무리하며

CI 환경 구축 시 복잡한 Docker Compose 설정보다는 GitHub Actions의 서비스를 직접 사용하는 방법이 더 쉽고 안정적인 선택일 수 있음을 확인했습니다.

비슷한 문제를 겪으시는 분들께 이 글이 조금이나마 도움이 되길 바랍니다! 🚀

'프로젝트' 카테고리의 다른 글

📌 Django OAuth 리팩토링 - 2편: OAuth Callback + JWT 쿠키 연동  (0) 2025.06.13
📌 Django OAuth 리팩토링 - 1편: secret.json → .env + OAuth API 리팩토링  (0) 2025.06.13
Django 프로젝트 명령어 정리  (1) 2025.06.11
📌 Docker PostgreSQL과 로컬 Django 연동 문제 해결 과정 정리 2/2  (0) 2025.06.11
📌 Docker PostgreSQL과 로컬 Django 연동 문제 해결 과정 정리 1/2  (0) 2025.06.11
'프로젝트' 카테고리의 다른 글
  • 📌 Django OAuth 리팩토링 - 2편: OAuth Callback + JWT 쿠키 연동
  • 📌 Django OAuth 리팩토링 - 1편: secret.json → .env + OAuth API 리팩토링
  • Django 프로젝트 명령어 정리
  • 📌 Docker PostgreSQL과 로컬 Django 연동 문제 해결 과정 정리 2/2
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (787)
      • Python (32)
      • 프로젝트 (110)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    chinanightlife
    btscomeback
    btsdischarge
    bts
    urbantrends
    classaction
    smartphonedurability
    titaniumcase
    basalcellcarcinoma
    americanlaw
    homebartrend
    travel ban
    americaparty
    btsreunion
    btsjungkook
    chatgpterror
    youngprofessionals
    hotcoffeecase
    RM
    college reunions
    뷔
    self-growth
    livebroadcast
    lawsuitculture
    life reflection
    remittance
    gpterror
    global politics
    newpoliticalparty
    trumpmuskclash
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
🚀 Django 프로젝트 GitHub Actions CI/CD 구축 시 문제 해결기 (with PostgreSQL, Redis)
상단으로

티스토리툴바