사전 준비
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파일을 확인
