알토르 9

toddcanwell·2025년 10월 3일

CI/CD

CI
continuous Integration: 지속적인 통합 으로 여러개발자가 만든 코드를 자주 통합하면서 자동 검증 해주는 과정

  1. 개발자가 각자 브랜치에서 작업 후 push
  2. github Actions에서 이벤트 감지
  3. 전체 애플리케이션 기준으로 자동 빌드 -> 테스트 실행
  4. 결과를 로그, 에러 메세지로 피드백
  5. 통과시 자동 Merge(option) 또는 Pull Request 후 수동 Merge

즉 , merge 전에 이 코드가 안전한지 자동으로 확인 검증 해주는 과정

CD
continuous Delivery/Deployment : 지속적인 제공/배포
main 브랜치로 Merge된 코드를 운영환경까지 자동으로 배포 또는 직전까지 하는과정
1. main 브랜치에 코드 merge -> 이벤트 발생
2. github Actions(Jenkins, Git Lab CI/CD 등)이 자동 배포 job 실행

  • CI = push → 자동 빌드/테스트 → merge 전 코드 검증
  • CD = main merge → 자동 배포(pull/빌드/재시작)

github Actions
github안에 내장된 CI/CD 자동화 툴
github 저장소에서 일어나는 이벤트(push,pull request, merge 등)
트리거로 삼아서 내가 미리 정의해둔 workflow를 자동으로 실행해주는 서비스
.github/workflows/*.yml 파일에 트리거(event),jobs,step을 정의해
빌드 테스트 배포등의 자동화 과정을 구성한다.

Workflow (전체 파이프라인)
    ├── Event (트리거/이벤트)
    ├── Job 1 (작업 단위)
    │   ├── Step 1
    │   ├── Step 2
    │   └── Step 3
    └── Job 2 (작업 단위)
        ├── Step 1
        └── Step 2
  1. Workflow (워크플로우)
    전체 CI/CD 파이프라인
    .github/workflows/deploy.yml 파일로 정의
    하나의 완전한 자동화 프로세스
  2. Event (이벤트)
    워크플로우를 실행시키는 트리거
    예: push, pull_request, schedule 등
    언제 실행할지 결정
  3. Job (작업)
    워크플로우 안의 실행 단위
    병렬 또는 순차 실행 가능
    각각 다른 운영체제에서 실행 가능
  4. Step (단계)
    Job 안의 개별 명령어들
    실제 작업을 수행하는 최소 단위

secrets
secrets : API Key나 비밀번호처럼 민감한 환경 변수를 안전하게 관리하기 위한 GitHub 기능.
API Key나 비밀번호 같은 민감한 데이터는 .env 파일에 저장하고 .gitignore로 업로드를 막는다.
하지만 GitHub Actions는 가상 환경에서 빌드·테스트를 실행하므로, .env가 없어 환경변수를 사용할 수 없다.
이를 해결하기 위해 GitHub Secrets 기능을 사용해, Actions 실행 시 보안된 환경변수로 자동 주입한다.

  1. Workflow 파일 작성
  2. GitHub Secrets 설정 (보안 정보)
    GitHub 저장소 → Settings → Secrets에 추가

1. workflow 작성

.github/workflows/deploy.yml

name: Deploy Backend to EC2

# 이벤트 트리거: main 브랜치에 push될 때 실행
on:
  push:
    branches: [ main ]
    paths:
      - 'app.py'
      - 'requirements.txt'
      - '.github/workflows/deploy.yml'

# 워크플로우 작업들
jobs:
  deploy:
    name: Deploy to EC2
    runs-on: ubuntu-latest
    
    steps:
    # Step 1: 코드 체크아웃
    - name: Checkout code
      uses: actions/checkout@v4
      
    # Step 2: EC2에 SSH 접속해서 배포 실행
    - name: Deploy to EC2
      uses: appleboy/ssh-action@v1.0.3
      with:
        host: ${{ secrets.EC2_HOST }}
        username: ${{ secrets.EC2_USER }}
        key: ${{ secrets.EC2_SSH_KEY }}
        port: ${{ secrets.EC2_PORT }}
        script: |
          echo "=== 배포 시작 ==="
          
          # 프로젝트 디렉토리로 이동
          cd 나의_프로젝트_디렉토리
          
          # 1. 현재 실행 중인 서비스 중지
          echo "서비스 중지 중..."
          sudo systemctl stop 나의 서비스 유닛  || echo "서비스가 이미 중지되어 있습니다"
          
          # 2. 최신 코드 가져오기
          echo "최신 코드 가져오는 중..."
          git pull origin main
          
          # 3. 환경변수 파일 생성
          echo "환경변수 파일 생성 중..."
          cat > .env << EOF
          OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}
          VECTOR_STORE_ID=${{ secrets.VECTOR_STORE_ID }}
          MONGODB_URI=${{ secrets.MONGODB_URI }}
          DATABASE_NAME=${{ secrets.DATABASE_NAME }}
          COLLECTION_NAME=${{ secrets.COLLECTION_NAME }}
          EOF
          
          # 4. 가상환경 활성화 및 의존성 업데이트
          echo "의존성 업데이트 중..."
          source .venv/bin/activate
          pip install -r requirements.txt
          deactivate
          
          # 5. 서비스 재시작
          echo "서비스 재시작 중..."
          sudo systemctl start 나의_구니콘
          sudo systemctl enable 나의_구니콘
          
          # 6. 서비스 상태 확인
          echo "서비스 상태 확인 중..."
          sudo systemctl status 나의_구니콘 --no-pager
          
          echo "=== 배포 완료 ==="
          
    # Step 3: 배포 결과 알림 (선택사항)
    - name: Notify deployment status
      if: always()
      run: |
        if [ ${{ job.status }} == 'success' ]; then
          echo "✅ 배포 성공!"
        else
          echo "❌ 배포 실패!"
        fi




2. Action Secrets 설정

test

초기추천질문리스트 4개 -> 3개로 수정후 push

코드 push
GitHub 서버에서 Workflow 실행
GitHub 서버가 EC2에 SSH로 원격 접속
설정한 명령들 자동 실행
실제 CD 구현, CI - github actions에서 가상머신에서 소스코드를 체크아웃하지만 빌드 및 테스트 하진않음.

로컬 수정 → GitHub Push → GitHub Actions 실행 → EC2 자동 배포

profile
toddcanwell

0개의 댓글