사전 준비
Spring Initializr을 사용해 포로젝트 준비
AWS S3 버킷 비우기(객체 영구 삭제, 정적 웹 사이트 호스팅 비활성화)
Github Actions?
빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼
워크플로는
.yml
에 의해 구성된다.
리소스 설정
1. Github Actions 생성
1) 리포지토리를 생성하고, Actions를 누른다.
Java wuth Gradle로 생성한다.
gradle.yml을 변경하지 않고 Commit new file을 클릭한다.
Actions에서 워크플로의 단계별 진행상황을 볼 수 있다.
지금은 yml을 설정하지 않았기 때문에 실패가 나온다.
2. Github Action 수정
- 리포지토리의 Settings 클릭
- Security>Actions 선택
- New repository secret으로 액세서 키 생성
- 보안을 위해 yml 파일에 직접 입력하는 것이 아니라 sercret으로 생성
- Name에는 변수 이름을, Value엔 변수의 값을 저장
- IAM User를 생성할 때 있는 액세스 키 ID 값과, 비밀 액세스 키 값을 각각 저장
3. 빌드파일 배포 및 실행을 위한 준비
- 애플리케이션 생성
- Github Actions 워크플로에서 사용해야 되기 때문에 규칙에 맞게 작성
배포 그룹 생성
로드 밸런싱 비활성화
배포 그룹 생성
4. gradle.yml 수정
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
# 본인의 S3 이름으로 설정
env:
S3_BUCKET_NAME: be-26-2d3edith
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'
# gradle script의 권한 문제를 해결하기 위해 파일을 실행할 수 있는 권한을 부여
- name: Run chmod to 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를 직접 작성하지 않음
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
# 등록한 Github Secret을 자동으로 불러옴
aws-access-key-id: $
# 등록한 Github Secret을 자동으로 불러옴
aws-secret-access-key: $
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
# CodeDeploy에게 배포 명령을 내림
# CodeDepky 애플리케이션 이름, 배포그룹 이름 확인!!!
- name: Code Deploy
run: >
aws deploy create-deployment --application-name be-26-2D3Edith
--deployment-config-name CodeDeployDefault.AllAtOnce
--deployment-group-name be-26-2D3Edith-group
--s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=practice-deploy.zip
- env와 CodeDeploy에서 이름을 제대로 입력하지 않으면 오류가 발생합니다.
워크플로가 성공적으로 완료되면, S3 버킷에 압축파일이 전송됩니다!
5. .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:
- location: scripts/deploy.sh
timeout: 60
runas: ubuntu
deploy.sh
경로: scripts> deploy.sh
#!/bin/bash
BUILD_JAR=$(ls /home/ubuntu/action/build/libs/practice-githubAction-deploy-0.0.1-SNAPSHOT.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 &
배포 로그 확인
$ cd #home으로 이동
$ cd action
$ ll #deploy.log와 deply_err.log파일을 확인