오봉이와 함께하는 개발 블로그
Github Actions & AWS를 이용한 CI/CD - 2 본문
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가 어떻게 흘러가는지는 자세한 내용은 공식 문서를 참조하자.
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