Github Action은 pull request
나 push
같은 이벤트를 트리거로 Github 작업 workflow를 구성할 수 있다. workflow는 하나 이상의 작업이 실행되는 자돟화 프로세스이며, 각 작업은 자체 가상 머신 또는 컨테이너 내부에서 실행된다.
workflow는 .yml 파일로 구성되며 테스트, 배포 등 기능에 따라 여러개의 workflow도 만들 수 있다.
여기서 주의깊게 봐야할 부분은 배포할 EC2에 Code Depoloy Agent가 설치되어 있어야 한다. Code Deploy는 appspec.yml
설정 파일에 의해 쉘 스크립트 등 단계에 따라 특정 동작을 수행한다.
Code Deploy Agent는 공식문서를 참고한다.
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 파일 설정
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
#!/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 &
# 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