GitHub Actions 활용한 CI/CD 구축
어떤 프로젝트던지 최소한의 마무리는 CI/CD 구축이라고 생각하는 사람이다...
1. .gitignore 파일 작성
# Python 관련
__pycache__/
*.pyc
*.pyo
*.pyd
*.sqlite3
# 가상 환경 (venv)
venv/
.env
*.env
# 로그 및 임시 파일
*.log
*.out
*.pid
.DS_Store
*.swp
# Docker 관련
*.tar
*.img
docker-compose.override.yml
# IDE 및 에디터 설정
.vscode/
.idea/
*.iml
# Airflow 관련 (데이터베이스 및 캐시)
airflow/airflow.cfg
airflow/unittests.cfg
airflow/logs/
airflow/tmp/
airflow_db/
# Elasticsearch 데이터 (로컬 실행 시 생길 수 있음)
elasticsearch/data/
elasticsearch/logs/
# FastAPI 관련 (캐시)
fastapi/__pycache__/
fastapi/.pytest_cache/
fastapi/.mypy_cache/
# Streamlit 관련
streamlit/__pycache__/
streamlit/.streamlit/
# GitHub Actions 실행 결과 캐시 방지
.github/
2. GitHub Respository 생성 후 코드 Push
나는 약간 구닥다리(?) 사람이기 때문에 깃 관련 작업은 Git Bash를 사용한다..
git init
git remote add origin <repository 주소>.git
git status
git add .
git push -u origin main
(나는 혼자 작업한 간단한 프로젝트라서 main 브랜치에 바로 push 했지만, 깃 브랜치 전략에 따라 develop 브랜치에서 작업하는 것을 추천한다.)
3. GitHub Repository -> Settings -> Secrets and variables -> Actions 경로에서 DOCKER_USERNAME, DOCKER_PASSWORD를 추가한다.
만약 Docker Hub 계정이 없다면 Docker Hub 사이트에서 계정을 생성해야하고, 중요한 점 중 하나는 DOCKER_USERNAME은 아이디(이메일)가 아닌 사용자 이름이다!
(DOCKER_USERNAME을 이메일로 세팅하는 바람에 CD 파이프라인에서 에러가 발생해서 알게 된 사실)

4. .github/workflows/ci.yml
프로젝트 루트 경로에 해당 파일을 작성해주자.
name: CI Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.9"
- name: Install Dependencies
run: |
pip install -r fastapi/requirements.txt
pip install -r streamlit/requirements.txt
- name: Check Docker & Docker Compose
run: |
docker --version
docker compose version || true
docker-compose version || true
- name: Install Docker Compose (if needed)
run: |
if ! command -v docker-compose &> /dev/null; then
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
fi
docker-compose version
- name: Build and Start Containers
run: |
cd elasticsearch # `docker-compose.yml`이 있는 디렉토리로 이동
docker-compose up -d --build
sleep 10
docker-compose ps
나는 일단 테스트 과정을 스킵했는데, 테스트 과정이 필요한 경우 반드시 해당 과정을 수행하도록 하자..
5. .github/workflows/cd.yml
name: CD Pipeline
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install Docker
run: |
curl -fsSL https://get.docker.com | sh
- name: Login to Docker Hub
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
- name: Build & Push FastAPI Docker Image
run: |
cd fastapi
docker build -t ${{ secrets.DOCKER_USERNAME }}/biosearch-fastapi:latest .
docker tag ${{ secrets.DOCKER_USERNAME }}/biosearch-fastapi:latest ${{ secrets.DOCKER_USERNAME }}/biosearch-fastapi:$GITHUB_SHA
docker push ${{ secrets.DOCKER_USERNAME }}/biosearch-fastapi:latest
docker push ${{ secrets.DOCKER_USERNAME }}/biosearch-fastapi:$GITHUB_SHA
- name: Build & Push Streamlit Docker Image
run: |
cd streamlit
docker build -t ${{ secrets.DOCKER_USERNAME }}/biosearch-streamlit:latest .
docker tag ${{ secrets.DOCKER_USERNAME }}/biosearch-streamlit:latest ${{ secrets.DOCKER_USERNAME }}/biosearch-streamlit:$GITHUB_SHA
docker push ${{ secrets.DOCKER_USERNAME }}/biosearch-streamlit:latest
docker push ${{ secrets.DOCKER_USERNAME }}/biosearch-streamlit:$GITHUB_SHA
6. GitHub Commit & Push
git status
git add .
git commit -m "commit message 작성"
git push -u origin main
Push 후 해당 레포지토리의 [Actions]에서 CI, CD 파이프라인 수행 결과를 확인할 수 있다.

세팅 설정 때문에 문제가 몇 번 있었지만 최종적으로 GitHub Actions를 통해 자동으로 Docker Hub에 프로젝트를 build하고 push하는 과정이 잘 구축되었다!
내가 구현한 파이프라인은 간단하지만, 앞으로 서버에 자동으로 배포하고, API 테스트를 추가하는 과정을 학습해서 프로젝트를 고도화할 수 있을 것 같다!
논문 검색 엔진 프로젝트 마무리 성공~!
'Data Engineering > Elasticsearch' 카테고리의 다른 글
| [Opensearch] Opensearch 개념 정리 (0) | 2025.02.11 |
|---|---|
| [Elasticsearch] 논문 검색 엔진 구현 프로젝트 (Elasticsearch + Airflow + FastAPI) (3) (0) | 2025.02.05 |
| [Elasticsearch] 논문 검색 엔진 구현 프로젝트 (Elasticsearch + Airflow + FastAPI) (2) (0) | 2025.02.05 |
| [Elasticsearch] 논문 검색 엔진 구현 프로젝트 (Elasticsearch + Airflow + FastAPI) (1) (0) | 2025.02.04 |
| [Elasticsearch] Elasticsearch 기본 개념 (0) | 2025.02.04 |