CI/CD
Github Actions, AWS Code Deploy
WEB(API Server)은 IoT와 App과 데이터를 주고받고 저장하는 역할을 하므로 다른 분야와의 협업과 연동을 위해서 API Server는 빠르게 개발되어야 하고 다른 분야에 제공하는 API의 코드가 최신 상태여야 한다. 따라서 아래와 같은 CI/CD 도구를 이용하여 협업 간의 효율을 높였다.


Github Actions
프로젝트에서 Github Actions과 AWS CodeDeploy를 이용하여 CI(지속적 통합)/CD(지속적 제공)를 적용하여 리포지토리에 커밋과 동시에 빌드를 진행하고 PR의 머지가 될 때 원격 서버에 자동으로 배포가 되게 하여 짧은 주기로 다른 분야 개발자들에게 제공하였다.

Github에서 push 이벤트가 발생하면 Github Actions로 trigger를 한다.
Github Actions에서는 정해진 Job과 Step에 따라 빌드를 하고 소스 코드를 *.jar 파일로 만들어 소스 코드와 함께 압축하여 AWS S3에 저장한다.
AWS CodeDeploy에 배포 요정을 하면 AWS S3에 저장되어 있는 압축된 소스 코드와 *.jar 파일을 가져와 원격 서버(AWS EC2)에 배포한다.
Github Actions workflow
deploy.yml
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Java CI with Gradle
env:
PROJECT_NAME: WEB_KookMoBan_PonJohmNaimann
on:
push:
branches:
- '*' # matches every branch that doesn't contain a '/'
- '*/*' # matches every branch containing a single '/'
- '**' # matches every branch
jobs:
deploy:
name: DEPLOY
runs-on: ubuntu-18.04
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Grant execute permission for gradlew
run: chmod +x gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew build
shell: bash
- name: Make zip file
run: zip -qq -r ./$GITHUB_SHA.zip .
shell: bash
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://osam-s3/$PROJECT_NAME/$GITHUB_SHA.zip
- name: Code Deploy
run: aws deploy create-deployment --application-name OSAM_Hackathon --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name dev --s3-location bucket=osam-s3,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip
AWS CodeDeploy
appsepc.yml
version: 0.0
os: linux
files:
- source: /
destination: /opt/OSAM_Hackathon
permissions:
- object: /opt/OSAM_Hackathon/
owner: ubuntu
group: ubuntu
mode: 755
hooks:
AfterInstall:
- location: deploy.sh
timeout: 60
runas: root
deploy.sh
AWS EC2에서 현재 동작하고 있는 Spring Boot Application의 PID값을 찾아 종료하고 새로운 Spring Boot Application을 실행한다.
#!/usr/bin/env bash
REPOSITORY=/opt/OSAM_Hackathon
cd $REPOSITORY
APP_NAME=OSAM_Hackathon
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep '.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME
CURRENT_PID=$(pgrep -f $APP_NAME)
if [ -z $CURRENT_PID ]
then
echo "> 종료할것 없음."
else
echo "> kill -9 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> $JAR_PATH 배포"
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &
Last updated
Was this helpful?