Data Engineering/Elasticsearch

[Elasticsearch] 논문 검색 엔진 구현 프로젝트 (Elasticsearch + Airflow + FastAPI) (4)

seoraroong 2025. 2. 6. 12:32

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 테스트를 추가하는 과정을 학습해서 프로젝트를 고도화할 수 있을 것 같다! 

 

논문 검색 엔진 프로젝트 마무리 성공~!