[CI/CD] 실제 CI/CD 파이프라인 구현 실습
[CI/CD] 실제 CI/CD 파이프라인 구현 실습
🚀 실제 CI/CD 파이프라인 흐름
최근 DevOps 분야에서 CI/CD는 필수적인 개발 프로세스가 되었습니다. 이번 글에서는 실제로 구현한 CI/CD 파이프라인의 전체 흐름을 단계별로 살펴보겠습니다.
📋 CI/CD 파이프라인 전체 흐름
graph LR
A[코드 변경] --> B[GitHub Push]
B --> C[GitHub Actions 트리거]
C --> D[빌드 & 테스트]
D --> E[Docker 이미지 생성]
E --> F[이미지 푸시]
F --> G[AWS EC2 배포]
1️⃣ 코드 변경 → GitHub에 Push
개발자가 로컬에서 코드를 수정하고 커밋한 후 GitHub 원격 저장소에 푸시하는 단계입니다.
1
2
3
git add .
git commit -m "feature: 새로운 기능 추가"
git push origin main
이 단계에서 중요한 점:
- 브랜치 전략: main, develop, feature 브랜치를 활용한 체계적인 관리
- 커밋 메시지: 일관된 형식으로 변경사항을 명확히 기록
- 코드 리뷰: PR(Pull Request)을 통한 코드 품질 검증
2️⃣ GitHub Actions → 자동 트리거
GitHub에 코드가 푸시되면 GitHub Actions 워크플로우가 자동으로 실행됩니다.
1
2
3
4
5
6
7
8
9
10
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
트리거 조건:
push
: main 브랜치에 코드가 푸시될 때pull_request
: PR이 생성되거나 업데이트될 때schedule
: 정해진 시간에 주기적으로 실행
3️⃣ 빌드 & 테스트 → 코드 컴파일, 테스트 실행
소스 코드를 컴파일하고 각종 테스트를 실행하여 코드 품질을 검증합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build application
run: npm run build
테스트 종류:
- 단위 테스트(Unit Test): 개별 함수/메소드 검증
- 통합 테스트(Integration Test): 모듈 간 상호작용 검증
- E2E 테스트: 전체 애플리케이션 플로우 검증
4️⃣ Docker 이미지 생성 → 애플리케이션 컨테이너화
빌드된 애플리케이션을 Docker 이미지로 패키징합니다.
1
2
3
4
5
6
7
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
1
2
3
4
5
- name: Build Docker image
run: docker build -t myapp:$ .
- name: Tag Docker image
run: docker tag myapp:$ myapp:latest
Docker 이미지의 장점:
- 환경 일관성: 개발, 테스트, 운영 환경에서 동일한 실행 환경
- 배포 간소화: 이미지 하나로 어디서든 실행 가능
- 롤백 용이성: 이전 버전 이미지로 빠른 롤백 가능
5️⃣ 이미지 푸시 → Docker Hub 또는 AWS ECR에 저장
생성된 Docker 이미지를 컨테이너 레지스트리에 저장합니다.
1
2
3
4
5
6
7
8
9
10
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: $
password: $
- name: Push to Docker Hub
run: |
docker push myapp:$
docker push myapp:latest
레지스트리 선택 기준:
- Docker Hub: 공개 프로젝트, 무료 사용
- AWS ECR: AWS 생태계, 보안 강화
- GitHub Container Registry: GitHub와 통합, 프라이빗 무료
6️⃣ AWS EC2 배포 → 새로운 이미지로 자동 배포 및 실행
마지막으로 AWS EC2 인스턴스에 새로운 이미지를 배포하고 실행합니다.
1
2
3
4
5
6
7
8
9
10
11
- name: Deploy to EC2
uses: appleboy/ssh-action@v0.1.5
with:
host: $
username: ubuntu
key: $
script: |
docker pull myapp:latest
docker stop myapp-container || true
docker rm myapp-container || true
docker run -d --name myapp-container -p 80:3000 myapp:latest
배포 전략:
- Blue-Green 배포: 무중단 배포를 위한 두 환경 교체
- Rolling 배포: 점진적으로 인스턴스 교체
- Canary 배포: 일부 트래픽만 새 버전으로 라우팅
🔧 파이프라인 최적화 포인트
1. 캐싱 활용
1
2
3
4
5
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: $-node-$
2. 병렬 처리
1
2
3
4
5
6
7
8
jobs:
test:
runs-on: ubuntu-latest
build:
runs-on: ubuntu-latest
deploy:
needs: [test, build]
runs-on: ubuntu-latest
3. 조건부 실행
1
2
3
- name: Deploy to production
if: github.ref == 'refs/heads/main'
run: echo "Deploying to production"
🚨 주의사항 및 모범 사례
보안
- Secrets 관리: GitHub Secrets를 활용한 민감정보 보호
- 최소 권한 원칙: 필요한 최소한의 권한만 부여
- 이미지 스캔: Docker 이미지 보안 취약점 검사
모니터링
- 로그 수집: 애플리케이션 및 인프라 로그 중앙화
- 메트릭 수집: 성능 지표 모니터링
- 알림 설정: 장애 발생 시 즉시 알림
백업 및 복구
- 데이터베이스 백업: 정기적인 자동 백업
- 롤백 계획: 빠른 이전 버전 복구 방안
- 재해 복구: 인프라 장애 대응 계획
💡 마무리
CI/CD 파이프라인은 단순히 자동화를 위한 도구가 아닙니다. 개발팀의 생산성을 높이고, 배포 리스크를 줄이며, 더 안정적인 서비스를 제공하기 위한 핵심 인프라입니다.
처음에는 복잡해 보일 수 있지만, 단계별로 구축하다 보면 개발 프로세스가 얼마나 효율적으로 개선되는지 체감할 수 있을 것입니다.
다음 글에서는 실제 GitHub Actions 워크플로우 파일 작성법과 AWS 배포 설정에 대해 더 자세히 다뤄보겠습니다.
참고 자료
This post is licensed under CC BY 4.0 by the author.