Github Actions + CodeDeploy

wangjh789·2022년 9월 11일
0

목표

  1. master 브랜치에 push 될 경우, Github Actions이 실행된다.
  2. Github Actions은 S3에 jar파일과 스크립트와 appspec.yml를 압축해 업로드 하고, CodeDeploy에게 배포를 명령?하는 역할을 한다.
  3. 배포의 타겟이 되는 배포그룹에 포함된 Ec2는 CodeDeploy Agent가 설치되어 있어 S3에서 압축파일을 받고 appspec.yml에 명시된 작업(스크립트를 실행)을 수행한다.

4.EC2 인스턴스에서 쉘 스크립트 실행한다. (실행중인 앱 종료하고 새롭게 배포된 앱 실행)

# git action
on:
  push:
    branches: [ master ]
    
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: 11
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
      
    - name: Build with Gradle
      run: |
        ./gradlew --version
        ./gradlew bootJar # 빌드

    - name: Make Dir
      run : |
        mkdir test
        mkdir test/scripts

    # Jar 파일 복사
    - name: Copy Jar
      run: cp ./build/libs/*.jar ./test

    # script
    - name: Copy script
      run : cp -r ./scripts/* ./test/scripts/

    # appspec
    - name: Copy appspec
      run: cp ./appspec.yml ./test

    # 파일 압축
    - name: Make zip file
      run: zip -r ./test.zip ./test
        
    # Deploy
    - name: Deploy
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.ACCESS_KEY }}
        aws-secret-access-key: ${{ secrets.SECRET_KEY }}
        aws-region: ap-northeast-2
        
    - name: Upload to S3
      run: aws s3 cp --region ap-northeast-2 <Git가상머신 내의 파일> s3://<버켓이름>/

    - name: Code Deploy
      run: aws deploy create-deployment --application-name <앱 이름> --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name <뱊 그룹> --s3-location bucket=<S3버켓 이름>,bundleType=zip,key=<버켓 내에 다운받을 파일>
# appspec.yml
version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app/ 
    # 다운받을 경로

permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

hooks:
  ApplicationStart:
  # 실행시킬 스크립트
    - location: scripts/deploy.sh
      timeout: 120
      runas: ec2-user
# scripts/deploy.sh
#!/bin/bash
BUILD_JAR=$(ls /home/ec2-user/app/*.jar)
JAR_NAME=$(basename $BUILD_JAR)
echo "> build 파일명: $JAR_NAME" >> /home/ec2-user/deploy/deploy.log

echo "> build 파일 복사" >> /home/ec2-user/deploy/deploy.log
DEPLOY_PATH=/home/ec2-user/deploy/
cp $BUILD_JAR $DEPLOY_PATH

echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ec2-user/deploy/deploy.log
CURRENT_PID=$(pgrep -f $JAR_NAME)

if [ -z $CURRENT_PID ]
then
  echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> /home/ec2-user/deploy/deploy.log
else
  echo "> kill -15 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포"    >> /home/ec2-user/deploy/deploy.log
nohup java -jar $DEPLOY_JAR >> /home/ec2-user/deploy.log 2>/home/ec2-user/deploy/deploy_err.log &
profile
기록

0개의 댓글

Powered by GraphCDN, the GraphQL CDN