AWS CodeDeploy, Github Actions CI/CD 파이프라인 구축 삽질 회고록
2024-11-28 updated
# 서론
CI/CD 파이프라인을 구축할 필요가 있어서 Github Actions로 파이프라인을 구축하던 도중 맞이했던 오류들과 해결법, 사용법 미숙으로 인한 시행착오, 삽질을 기록하기 위함이다.
Github Actions 배포자동화 과정은 다음 블로그 글을 전적으로 참고했다.
https://bcp0109.tistory.com/363
# Codedeploy Agent 설치 오류 - Ubuntu 버전과 Ruby 버전 호환성 오류
EC2 인스턴스에 Ubuntu 22.04 LTS를 사용한다면 Ruby 버전과 호환성 충돌이 나서 Codedeploy Agent의 install이 실행되지 않는 문제가 있다.
원인은 22.04 버전에는 Ruby 3.x 버전이 깔리는데, 이상하게도 Codedeploy Agent는 Ruby 2.x 버전만 호환되는 것 같았다.
Ruby를 2.x버전으로 다운그레이드 하는 방법은 구글링 해보니까 좀 복잡해서 그냥 Ubuntu 20.04 LTS 버전으로 인스턴스를 바꾸면서 해결했다.
---
[2024-11-28] 기준 22.04 버전도 정상적으로 가능
EC2 프리티어가 20.04 버전이 사라져서 22.04 버전으로 해봤는데, 이제 CodeDeploy가 Ruby 3.x 버전을 지원하는 것 같다!
# build.gradle.kts 설정 - jar 초기 빌드 이름 변경하기
Kotlin DSL 설정이 Groovy 설정과 달라서 살짝 삽질했었는데, 다음과 같이 작성하면 된다.
# 파일 덮어쓰기 오류
빌드할 때 기존파일이 존재해서 CodeDeploy에서 오류가 난다면, appspec.yml의 files 부분을 아래처럼 수정하면 된다.
*여담으로 파일 확장자를 appspec.yaml로 하면 인식을 못 한다.
appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app
file_exists_behavior: OVERWRITE
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
AfterInstall:
- location: stop.sh
timeout: 60
runas: ubuntu
ApplicationStart:
- location: start.sh
timeout: 60
runas: ubuntu
# DB설정 파일과 같이 Github에 올릴 수 없는 설정파일 동적으로 생성하기
보통 DB 설정파일은 로컬에서만 유지하고 Github에는 업로드 하지 않는다.
하지만 Github Actions를 사용하여 빌드를 하면, Github 레포에 있는 내용물을 빌드하게 되므로 DB설정파일 (application-db.yml)을 넣지 않고 빌드를 하게 되는데, 이를 해결하는 방법은 다음과 같다.
1. application-secret.yml 을 base64로 인코딩하기
2. 인코딩한 결과물을 Github -> settings -> secrets에 저장하기
3. Github Actions deploy.yml에 스크립트 추가하기
먼저 application-secret.yml을 base64로 인코딩한다.
그리고 Github settings로 들어가서 secrets에 이 결과물을 저장한다.
이제 Github Actions deploy.yml에 다음과 같은 스크립트를 추가한다.
이렇게 하면 Github Actions이 프로젝트를 빌드할 때, 저 인코딩 된 application-secrets.yml을 디코딩해서 동적으로 넣어주고, 빌드를 진행해 준다.
자세한 설명은 다음 블로그를 참조할 것
https://mumomu.tistory.com/132?category=1017703
deploy.yml
name: Deploy to Amazon EC2
on:
push:
branches:
- master
# 본인이 설정한 값을 여기서 채워넣습니다.
# 리전, 버킷 이름, CodeDeploy 앱 이름, CodeDeploy 배포 그룹 이름
env:
AWS_REGION: ap-northeast-2
S3_BUCKET_NAME: youth-moa-cicd
CODE_DEPLOY_APPLICATION_NAME: youth-moa-code-deploy
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: youth-moa-deploy-group
permissions:
contents: read
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
# (1) 기본 체크아웃
- name: Checkout
uses: actions/checkout@v3
# (2) JDK 17 세팅
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Copy application-secret.properties
env:
PROPERTIES_SECRET: ${{ secrets.APPLICATION_SECRET_PROPERTEIS }}
PROPERTIES_DIR: src/main/resources
PROPERTIES_FILE_NAME: application-secret.properties
run: echo $PROPERTIES_SECRET | base64 --decode > $PROPERTIES_DIR/$PROPERTIES_FILE_NAME
# (3) Gradle build (Test 제외)
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew bootJar
# (4) AWS 인증 (IAM 사용자 Access Key, Secret Key 활용)
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ${{ env.AWS_REGION }}
# (5) 빌드 결과물을 S3 버킷에 업로드
- name: Upload to AWS S3
run: |
aws deploy push \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--ignore-hidden-files \
--s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \
--source .
# (6) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
- name: Deploy to AWS EC2 from S3
run: |
aws deploy create-deployment \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
--s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip