Github Actions

박윤택·2022년 10월 22일
1

ci/cd

목록 보기
2/2

Github Action

Github Action은 pull requestpush 같은 이벤트를 트리거로 Github 작업 workflow를 구성할 수 있다. workflow는 하나 이상의 작업이 실행되는 자돟화 프로세스이며, 각 작업은 자체 가상 머신 또는 컨테이너 내부에서 실행된다.
workflow는 .yml 파일로 구성되며 테스트, 배포 등 기능에 따라 여러개의 workflow도 만들 수 있다.


Github Actions를 이용한 배포 과정 (ubuntu 기준)

여기서 주의깊게 봐야할 부분은 배포할 EC2에 Code Depoloy Agent가 설치되어 있어야 한다. Code Deploy는 appspec.yml 설정 파일에 의해 쉘 스크립트 등 단계에 따라 특정 동작을 수행한다.

Code Deploy Agent는 공식문서를 참고한다.


Github Actions를 이용한 배포 (ubuntu 기준)

1. 레포지토리의 Actions 탭을 클릭

2. 빌드하는 방법에 따른 workflow 구성을 선택

3. Gradle.yml 작성

name: Java CI with Gradle

on:
  # 트리거 동작
  push:
    # 트리거할 브랜치
    branches: [ "main" ]

permissions:
  contents: read
  
env:
  S3_BUCKET_NAME: [S3 버킷 이름]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
    # graldew 실행 가능하게 권한 설정
    - name: Make gradlew executable
      run: chmod +x ./gradlew       
    - name: Build with Gradle
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: build
    
    # build한 후 프로젝트를 압축합니다.
    - name: Make zip file
      run: zip -r ./practice-deploy.zip .
      shell: bash
    
    # Access Key와 Secret Access Key를 통해 권한을 확인
    # 아래 코드에 Access Key와 Secret Key를 직접 작성 x
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불러와짐
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # 등록한 Github Secret이 자동으로 불러와짐
        aws-region: ap-northeast-2
    
    # 압축한 프로젝트를 S3로 전송
    - name: Upload to S3
      run: aws s3 cp --region ap-northeast-2 ./practice-deploy.zip s3://$S3_BUCKET_NAME/practice-deploy.zip

4. Github Secret 등록
앞서 작성한 Gradle.yml에 secrets.AWS_ACCESS_KEY, secrets.AWS_SECRET_ACCESS_KEY를 사용하였는데 이를 Github에서 등록한다.

여기까지가 s3로 빌드된 파일을 전송하는 flow다 !

5. Code Deploy와 Github Repository 연동
Code Deploy 애플리케이션을 생성한다.


컴퓨팅 플랫폼을 EC2/온프레미스로 설정한다.


배포 그룹을 설정한다.

6. .yml 파일 설정

  • appspec.yml 작성
version: 0.0
os: linux
files:
  - source:  /
    # 해당 디렉토리 내에서 배포가 진행됨
    destination: /home/ubuntu/action
    overwrite: yes

permissions:
  - object: /
    pattern: "**"
    owner: ubuntu
    group: ubuntu

hooks:
  ApplicationStart:
    # 최상위 디렉토리에 scripts 폴더 내의 쉘 스크립트가 실행됨
    - location: scripts/deploy.sh
      timeout: 60
      runas: ubuntu



  • deploy.sh 작성
#!/bin/bash
BUILD_JAR=$(ls /home/ubuntu/action/build/libs/[빌드된 jar 파일].jar)
JAR_NAME=$(basename $BUILD_JAR)

echo "> 현재 시간: $(date)" >> /home/ubuntu/action/deploy.log

echo "> build 파일명: $JAR_NAME" >> /home/ubuntu/action/deploy.log

echo "> build 파일 복사" >> /home/ubuntu/action/deploy.log
DEPLOY_PATH=/home/ubuntu/action/
cp $BUILD_JAR $DEPLOY_PATH

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

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


DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR 배포"    >> /home/ubuntu/action/deploy.log
sudo nohup java -jar $DEPLOY_JAR >> /home/ubuntu/deploy.log 2>/home/ubuntu/action/deploy_err.log &



  • Gradle.yml 파일 추가
    # CodeDeploy에게 배포 명령을 내립니다.
    - name: Code Deploy
      run: >
        aws deploy create-deployment --application-name [Code Deploy 애플리케이션 이름]
        --deployment-config-name CodeDeployDefault.AllAtOnce
        --deployment-group-name [Code Deploy 보안 그룹 이름]
        --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=practice-deploy.zip

0개의 댓글