GitHub Actions를 사용하여 Spring Boot 애플리케이션의 CI/CD 파이프라인을 구축하는 과정입니다. 이를 통해 애플리케이션의 자동 빌드, 테스트, 배포 과정을 자동화하여 개발을 효율적으로 진행할 수 있도록 하였습니다.
CI 도구로 Github Action를 사용하고 CD로는 AWS CodeDeploy를 사용하여 Spring Gradle 프로젝트 자동 배포를 구현하였습니다.
전체적인 과정은 다음과 같습니다.
name: Spring Boot & Gradle CI/CD
on:
push:
branches:
- main
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
# application-deploy.yml을 application.yml로 변경합니다. 배포 버전의 설정 파일을 사용하기 위한 작업입니다.
- name: Change application.yml to deploy version
run: |
cd ./src/main/resources
rm ./application.yml
mv ./application-deploy.yml ./application.yml
cat application.yml
# 환경 변수와 시크릿 값을 사용하여 application-secret.yml 파일을 생성합니다. 이 파일에는 보안 관련 설정이 포함됩니다.
- name: Make application-secret.yml
env:
GOOGLE_OAUTH_CLIENT_ID: ${{ secrets.GOOGLE_OAUTH_CLIENT_ID }}
GOOGLE_OAUTH_CLIENT_SECRET: ${{ secrets.GOOGLE_OAUTH_CLIENT_SECRET }}
JWT_TOKEN_SECRET: ${{ secrets.JWT_TOKEN_SECRET }}
AWS_S3_ACCESS_KEY: ${{ secrets.AWS_S3_ACCESS_KEY }}
AWS_S3_KEY_SECRET: ${{ secrets.AWS_S3_KEY_SECRET }}
AGORA_APP_ID: ${{ secrets.AGORA_APP_ID }}
AGORA_APP_CERTIFICATE: ${{ secrets.AGORA_APP_CERTIFICATE }}
run: |
cd ./src/main/resources
echo -e \
"
spring:
security:
oauth2:
client:
registration:
google:
client-id: $GOOGLE_OAUTH_CLIENT_ID
client-secret: $GOOGLE_OAUTH_CLIENT_SECRET
scope:
- profile
- email
jwt:
secret: $JWT_TOKEN_SECRET
cloud:
aws:
credentials:
accessKey: $AWS_S3_ACCESS_KEY
secretKey: $AWS_S3_KEY_SECRET
agora:
appId: $AGORA_APP_ID
appCertificate: $AGORA_APP_CERTIFICATE
" > application-security.yml
cat application-security.yml
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew clean build
- name: Make Directory for deliver
run: mkdir deploy
- name: Copy Jar
run: cp ./build/libs/*.jar ./deploy/
- name: Copy AppSpec
run: cp ./appspec.yml ./deploy/
- name: Copy deploy.sh
run: cp ./scripts/* ./deploy/
- name : Make zip file
run: zip -r -qq -j ./vingterview-build.zip ./deploy
- name: Upload to AWS S3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_SECRET }}
run: |
aws s3 cp \
--region ap-northeast-2 \
--acl private \
./vingterview-build.zip s3://$S3_BUCKET_NAME/
- name: Deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_SECRET }}
run: |
aws deploy create-deployment \
--application-name $CODEDEPLOY_NAME \
--deployment-group-name $CODEDEPLOY_GROUP \
--file-exists-behavior OVERWRITE \
--s3-location bucket=$S3_BUCKET_NAME, bundleType=zip,key=vingterview-build.zip \
--region ap-northeast-2
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app/deploy
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: deploy.sh
timeout: 60
runas: ubuntu
#! /bin/bash
REPOSITORY=/home/ubuntu/app/deploy
PROJECT_NAME=vingterview
echo "> 현재 구동중인 어플리케이션 확인"
CURRENT_PID=$(pgrep -f "vingterview.*\.jar" | awk '{print $1}')
echo "> 현재 구동중인 어플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동중인 어플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)
echo "> JAR_NAME: $JAR_NAME"
echo "> $JAR_NAME에 실행 권한 추가"
chmod +x $JAR_NAME
echo ">$JAR_NAME 실행"
nohup java -jar \
$JAR_NAME > $REPOSITORY/nohup.out 2>&1 &