CI/CD

Github Actions, AWS Code Deploy

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

Github Actions
AWS Code Deploy

Github Actions

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

CI/CD Pipeline
  1. Github에서 push 이벤트가 발생하면 Github Actionstrigger를 한다.

  2. Github Actions에서는 정해진 JobStep에 따라 빌드를 하고 소스 코드를 *.jar 파일로 만들어 소스 코드와 함께 압축하여 AWS S3에 저장한다.

  3. 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 ApplicationPID값을 찾아 종료하고 새로운 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?