🚀 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 |