18.2 GitHub Actions를 이용한 CI/CD 자동 구축
GitHub Actions를 이용해 main 브랜치에 코드를 Push할 때마다 테스트 → Docker 이미지 빌드 → EC2 배포까지 자동화하는 파이프라인을 구성합니다.
1. CI 파이프라인 (.github/workflows/ci.yml)
name: CI - Test and Build
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
test:
name: 테스트 실행
runs-on: ubuntu-latest
services:
mysql: # 통합 테스트용 MySQL 컨테이너 기동
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: test
MYSQL_DATABASE: testdb
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=5s
steps:
- uses: actions/checkout@v4
- name: JDK 21 설정
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: 'gradle'
- name: 테스트 실행
run: ./gradlew test
env:
SPRING_DATASOURCE_URL: jdbc:mysql://localhost:3306/testdb
SPRING_DATASOURCE_PASSWORD: test
2. CD 파이프라인 — Docker 빌드 및 EC2 배포
deploy:
name: EC2 배포
needs: test # test 잡이 성공해야만 실행
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Docker Hub 로그인
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker 이미지 빌드 및 푸시
run: |
docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/todo-app:${{ github.sha }} .
docker push ${{ secrets.DOCKERHUB_USERNAME }}/todo-app:${{ github.sha }}
- name: EC2 SSH 접속 후 배포
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
docker pull ${{ secrets.DOCKERHUB_USERNAME }}/todo-app:${{ github.sha }}
docker stop todo-app || true
docker rm todo-app || true
docker run -d \
--name todo-app \
-p 8080:8080 \
-e SPRING_DATASOURCE_URL=${{ secrets.DB_URL }} \
-e SPRING_DATASOURCE_PASSWORD=${{ secrets.DB_PASSWORD }} \
${{ secrets.DOCKERHUB_USERNAME }}/todo-app:${{ github.sha }}
Repository Settings → Secrets and variables → Actions에 DOCKERHUB_USERNAME, EC2_HOST, EC2_PRIVATE_KEY, DB_URL 등 민감한 값을 저장해두면 파이프라인에서 ${{ secrets.xxx }}로 안전하게 참조할 수 있습니다.