CI&CD
174. [CI/CD] GitHub Actions를 이용한 배포 자동화
천재단미
2025. 3. 18. 20:38
728x90
반응형
1. GitHub Actions 개요
- GitHub Actions: GitHub 저장소에서 발생하는 이벤트(Push, PR 등)를 트리거로 워크플로우(자동화 스크립트)를 실행
- 워크플로우: .github/workflows/*.yml 파일로 구성되며, 각 단계(job)·작업(step)을 정의
- 장점: 운영 환경과 무관하게 언제나 동일한 가상머신에서 빌드·테스트·배포
2. 배포 흐름
- main 브랜치에 커밋 푸시 → 워크플로우 시작
- 소스 코드 체크아웃 → JDK 설치 → Gradle 빌드
- 빌드 결과물 압축(예: build/libs/*.jar)
- AWS 자격증명(Configuration)
- 압축파일을 S3 버킷에 업로드
- CodeDeploy에 배포 요청 → EC2에 전달
- EC2에서 appspec.yml·deploy.sh 실행 → 애플리케이션 재시작
3. 사전 준비
- Public Repository: GitHub Actions 무료 사용
- AWS 리소스
- S3 버킷
- CodeDeploy 애플리케이션/배포 그룹
- EC2 인스턴스(Agent 설치 완료)
- EC2 사전 설정
- AWS CLI 설치
- CodeDeploy Agent 설치 및 실행
- IAM 사용자
- S3, CodeDeploy, EC2에 접근 가능한 권한 부여
- Access Key ID / Secret Key 발급
4. GitHub Secrets 등록
- GitHub → Settings > Secrets and variables > Actions
- New repository secret 클릭
- 아래 네 가지 키를 등록
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_REGION (예: ap-northeast-2)
- S3_BUCKET_NAME (예: my-deploy-bucket)
5. 워크플로우 구성 (.github/workflows/gradle.yml)
저장소 루트에 .github/workflows/gradle.yml 파일을 생성하고, 다음과 같이 작성합니다:
name: Java CI & CD with CodeDeploy
on:
push:
branches: [ "main" ]
permissions:
contents: read
env:
S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }}
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. 소스 체크아웃
- uses: actions/checkout@v3
# 2. JDK 11 설치
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
# 3. Gradle 빌드
- name: Build with Gradle
uses: gradle/gradle-build-action@v2
with:
arguments: build
# 4. 빌드 결과 압축
- name: Zip build artifact
run: |
mkdir output
cp build/libs/*.jar output/
cd output
zip -r app.zip .
# 5. AWS 자격증명 설정
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
# 6. S3에 업로드
- name: Upload artifact to S3
run: |
aws s3 cp output/app.zip s3://$S3_BUCKET_NAME/app.zip
# 7. CodeDeploy로 배포 요청
- name: Create CodeDeploy Deployment
run: |
aws deploy create-deployment \\
--application-name MyApp \\
--deployment-group-name MyApp-Prod-Group \\
--deployment-config-name CodeDeployDefault.AllAtOnce \\
--s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=app.zip
<application-name>과 <deployment-group-name>은 7장에서 생성하는 리소스 이름으로 변경하세요.
6. S3 업로드 설정
- 업로드 대상 경로: s3://<버킷 이름>/app.zip
- 이후 CodeDeploy가 이 ZIP을 가져와 EC2에 배포
7. CodeDeploy 애플리케이션·배포 그룹 생성
- AWS 콘솔 → CodeDeploy → Applications → Create application
- Name: MyApp
- Compute platform: EC2/On-Premises
- 생성된 애플리케이션 → Create deployment group
- Name: MyApp-Prod-Group
- Service role: CodeDeploy 권한이 있는 IAM Role
- Deployment settings: AllAtOnce
- 환경 구성: EC2 태그 또는 Auto Scaling 그룹
8. appspec.yml 및 deploy.sh 작성
8.1. appspec.yml
프로젝트 루트에 appspec.yml을 추가합니다:
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app
overwrite: yes
hooks:
ApplicationStart:
- location: scripts/deploy.sh
timeout: 300
runas: ubuntu
8.2. deploy.sh
scripts/deploy.sh 생성 후 실행 권한 부여(chmod +x scripts/deploy.sh):
#!/bin/bash
set -e
TARGET_DIR=/home/ubuntu/app
JAR=$(ls $TARGET_DIR/*.jar | head -n1)
# 로그
echo "[$(date)] 배포 시작: $JAR" >> $TARGET_DIR/deploy.log
# 기존 프로세스 종료
PID=$(pgrep -f "$JAR" || true)
if [ -n "$PID" ]; then
echo "[$(date)] 기존 애플리케이션 종료: PID $PID" >> $TARGET_DIR/deploy.log
kill -9 $PID
sleep 5
fi
# 새로 배포
nohup java -jar "$JAR" >> $TARGET_DIR/deploy.log 2>&1 &
echo "[$(date)] 애플리케이션 기동 완료." >> $TARGET_DIR/deploy.log
9. 워크플로우에 CodeDeploy 호출 추가
5장에서 살펴본 워크플로우에 이미 aws deploy create-deployment 단계가 포함되어 있습니다.
이제 main 브랜치에 푸시할 때마다:
- 빌드 → ZIP
- S3 업로드
- CodeDeploy 배포
가 자동으로 이루어집니다.
10. 배포 결과 및 로그 확인
- EC2 접속
- /home/ubuntu/app/deploy.log 확인
- ps -ef | grep java 로 프로세스 실행 여부 점검
- CodeDeploy 콘솔
- Deployments 탭에서 상태(Succeeded/Failed) 확인
- 각 배포 이벤트별 상세 로그 열람 가능
- GitHub Actions
- Actions 탭에서 워크플로우 실행 히스토리 및 단계별 성공·실패 확인
맺음말
이제 GitHub Actions를 통해 코드 푸시 한 번으로:
- 소스 빌드
- S3에 아티팩트 업로드
- CodeDeploy를 통한 EC2 배포
까지 모든 과정을 자동화할 수 있습니다.
앞으로 이 워크플로우를 기반으로 롤링 업데이트, 다중 환경(스테이징·프로덕션) 배포, 테스트 자동화 등을 확장해 보세요!
728x90
반응형