오봉이와 함께하는 개발 블로그

Github Actions & AWS를 이용한 CI/CD - 2 본문

BE

Github Actions & AWS를 이용한 CI/CD - 2

오봉봉이 2023. 10. 25. 00:02
728x90

Github Actions 작성

아래 내용을 프로젝트의 루트/.github/????(원하는 이름).yml 으로 입력한다.

# workflow의 이름
name: CI

# 해당 workflow가 언제 실행될 것인지에 대한 트리거를 지정
on:
  push:
    branches: [ main ] # main branch로 push 될 때 실행됩
  pull_request:
    branches: [ main ]  # main branch로 pull request될 때 실행

env:
  AWS_REGION: ap-northeast-2
  AWS_S3_BUCKET: 각자 설정한 이름 입력
  AWS_CODE_DEPLOY_APPLICATION: 각자 설정한 이름 입력
  AWS_CODE_DEPLOY_GROUP: 각자 설정한 이름 입력

# workflow는 한개 이상의 job을 가지며, 각 job은 여러 step에 따라 단계를 나눌 수 있음
jobs:
  build-with-gradle:
    name: CI
    # 해당 jobs에서 아래의 steps들이 어떠한 환경에서 실행될 것인지를 지정
    runs-on: ubuntu-20.04

    steps:
     # 작업에서 액세스할 수 있도록 $GITHUB_WORKSPACE에서 저장소를 체크아웃
      - uses: actions/checkout@v2
      - name: Set up JDK 1.8
        uses: actions/setup-java@v2
        with:
          java-version: '8'
          distribution: 'adopt'

      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew
        shell: bash

      - name: Build with Gradle
        run: ./gradlew clean build -x test
        shell: bash

      - name: AWS credential
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: ${{ env.AWS_REGION }}
          aws-access-key-id: ${{ secrets.DNL_MAIN_ACCESS }}
          aws-secret-access-key: ${{ secrets.DNL_MAIN_SECRET }}

      # $AWS_S3_BUCKET/각자 설정한 이름 입력 >> S3 설정 시 입력했던 값을 입력하면 된다.
      - name: Upload to S3
        run: aws deploy push --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --ignore-hidden-files --s3-location s3://$AWS_S3_BUCKET/각자 설정한 이름 입력/$GITHUB_SHA.zip --source .

      - name: Deploy EC2
        run: aws deploy create-deployment --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }} --s3-location bucket=$AWS_S3_BUCKET,key=각자 설정한 이름 입력/$GITHUB_SHA.zip,bundleType=zip

appspec.yml

아래 내용을 프로젝트 루트/appspec.yml 에 입력한다.

Code Deploy가 실행할 일들을 작성하는 곳이다.
각 workflow가 어떻게 흘러가는지는 자세한 내용은 공식 문서를 참조하자.

https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html

version: 0.0
os: linux

files:
  - source:  /
    destination: /home/ubuntu/server
    overwrite: yes

permissions:
  - object: /
    owner: ubuntu
    group: ubuntu

hooks:
  AfterInstall:
    - location: ./scripts/stop.sh
      timeout: 60
  ApplicationStart:
    - location: ./scripts/start.sh
      timeout: 60

scripts

아래 내용을 프로젝트 루트/scripts/stop.sh , 프로젝트 루트/scripts/start.sh 에 입력하자

#!/bin/bash

# stop.sh
ROOT_PATH="/home/ubuntu/server"
JAR="$ROOT_PATH/application.jar"
STOP_LOG="$ROOT_PATH/stop.log"
SERVICE_PID=$(pgrep -f $JAR) # Spring PID

if [ -z "$SERVICE_PID" ]; then
  echo "서비스 NouFound" >> $STOP_LOG
else
  echo "서비스 종료 " >> $STOP_LOG
  kill "$SERVICE_PID"
  # kill -9 $SERVICE_PID # 강제 종료 명령어
fi
#!/bin/bash

# start.sh
ROOT_PATH="/home/ubuntu/server"
JAR="$ROOT_PATH/application.jar"

APP_LOG="$ROOT_PATH/application.log"
ERROR_LOG="$ROOT_PATH/error.log"
START_LOG="$ROOT_PATH/start.log"

NOW=$(date +%c)

echo "[$NOW] $JAR CP" >> $START_LOG
cp $ROOT_PATH/build/libs/각자 프로젝트에 맞는 jar 파일.jar $JAR

echo "[$NOW] > $JAR EXEC" >> $START_LOG
nohup java -jar $JAR > $APP_LOG 2> $ERROR_LOG &

SERVICE_PID=$(pgrep -f $JAR)
echo "[$NOW] > SERVICE PID: $SERVICE_PID" >> $START_LOG

배포

입력이 끝났으면 저장 사항을 Push하고 workflow를 확인하자

초록색으로 뜨면 완료된 것이다.

S3 확인

프로젝트 압축 파일이 잘 올라와 있다.

Code Deploy 확인

성공했다

접속

EC2 인스턴스 퍼블릭 IPv4 주소:port에 접속해서 정말 되었는지 확인해보자.

Todo

application.propertis 파일은 공개되면 안 되는 민감한 정보들이 있기 때문에 push하면 안 되지만, 일단 private Repository이기 때문에 같이 올려서 테스트 했지만, Github Repository에서 Security 탭에 키페어 등록했을 때 했던 방식으로 application.properties도 같이 관리하는 것이 좋다.

또, AWS를 통해 CI/CD 할 때 Code Deploy의 LifeCycle이 어떻게 동작하는지에 대해서도 포스팅 해야겠다.
참고로 Code Deploy에서 배포 ID를 클릭하면 다양한 정보들과 어떤 이벤트가 발생했고 얼마나 소요됐는지 알 수 있으니 궁금한 분들은 보면 좋을 거 같다.

728x90

'BE' 카테고리의 다른 글

Github Actions & AWS를 이용한 CI/CD - 1  (0) 2023.10.24
BE - 웹 프로그래밍 개요  (0) 2021.12.27
Comments