CI
continuous Integration: 지속적인 통합 으로 여러개발자가 만든 코드를 자주 통합하면서 자동 검증 해주는 과정
즉 , merge 전에 이 코드가 안전한지 자동으로 확인 검증 해주는 과정
CD
continuous Delivery/Deployment : 지속적인 제공/배포
main 브랜치로 Merge된 코드를 운영환경까지 자동으로 배포 또는 직전까지 하는과정
1. main 브랜치에 코드 merge -> 이벤트 발생
2. github Actions(Jenkins, Git Lab CI/CD 등)이 자동 배포 job 실행
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
secrets
secrets : API Key나 비밀번호처럼 민감한 환경 변수를 안전하게 관리하기 위한 GitHub 기능.
API Key나 비밀번호 같은 민감한 데이터는 .env 파일에 저장하고 .gitignore로 업로드를 막는다.
하지만 GitHub Actions는 가상 환경에서 빌드·테스트를 실행하므로, .env가 없어 환경변수를 사용할 수 없다.
이를 해결하기 위해 GitHub Secrets 기능을 사용해, Actions 실행 시 보안된 환경변수로 자동 주입한다.
.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



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




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