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. 배포 흐름

  1. main 브랜치에 커밋 푸시 → 워크플로우 시작
  2. 소스 코드 체크아웃 → JDK 설치 → Gradle 빌드
  3. 빌드 결과물 압축(예: build/libs/*.jar)
  4. AWS 자격증명(Configuration)
  5. 압축파일을 S3 버킷에 업로드
  6. CodeDeploy에 배포 요청 → EC2에 전달
  7. 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 등록

  1. GitHub → Settings > Secrets and variables > Actions
  2. New repository secret 클릭
  3. 아래 네 가지 키를 등록
    • 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 애플리케이션·배포 그룹 생성

  1. AWS 콘솔 → CodeDeploy → ApplicationsCreate application
    • Name: MyApp
    • Compute platform: EC2/On-Premises
  2. 생성된 애플리케이션 → 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 브랜치에 푸시할 때마다:

  1. 빌드 → ZIP
  2. S3 업로드
  3. CodeDeploy 배포

가 자동으로 이루어집니다.


10. 배포 결과 및 로그 확인

  1. EC2 접속
    • /home/ubuntu/app/deploy.log 확인
    • ps -ef | grep java 로 프로세스 실행 여부 점검
  2. CodeDeploy 콘솔
    • Deployments 탭에서 상태(Succeeded/Failed) 확인
    • 각 배포 이벤트별 상세 로그 열람 가능
  3. GitHub Actions
    • Actions 탭에서 워크플로우 실행 히스토리 및 단계별 성공·실패 확인

맺음말

이제 GitHub Actions를 통해 코드 푸시 한 번으로:

  • 소스 빌드
  • S3에 아티팩트 업로드
  • CodeDeploy를 통한 EC2 배포

까지 모든 과정을 자동화할 수 있습니다.

앞으로 이 워크플로우를 기반으로 롤링 업데이트, 다중 환경(스테이징·프로덕션) 배포, 테스트 자동화 등을 확장해 보세요!

728x90
반응형