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