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://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
name: Java CI with Gradle
on:
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
# 1. 워크플로우 실행 전 체크아웃 필요
- name: Checkout
uses: actions/checkout@v3
# 2. JDK 17버전 설치
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# 3-1. Gradle에 excute 권한 부여
- name: Grant excute permission for gradlew
run: chmod +x gradlew
# 3-2. Gradle 사용하여 빌드
- name: Build with Gradle
run: ./gradlew clean build
on : 워크플로우를 수행할 이벤트를 결정jobs : 수행할 워크플로우를 작성

my-ec2-tag-key를 추가했다.
AmazonS3FullAccess 권한을 가진 my-ec2-iam-role 역할 추가
sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
# https://{bucket-name}.s3.{리전식별자}.amazonaws.com/lastestinstall
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto > /tmp/logfile
sudo service codedeploy-agent status

AWSCodeDeployRole 권한으로 생성한다.my-ec2-tag-key 태그 추가CodeDeployDefault.AllAtOnceAWSCodeDeployFull, AWSCodeDeployFullAccess 권한을 추가한다.version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
AfterInstall:
- location: scripts/stop.sh
timeout: 60
runas: ubuntu
ApplicationStart:
- location: scripts/start.sh
timeout: 60
runas: ubuntu
files : 배포 파일에 대한 설정
permissions : files 섹션에서 복사한 파일에 대한 권한 설정
hooks : 배포 이후에 수행할 스크립트를 지정할 수 있다.
- location : hooks 에서 실행할 스크립트 위치
script/start.sh
#!/usr/bin/env bash
PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/spring-webapp.jar"
APP_LOG="$PROJECT_ROOT/application.log"
ERROR_LOG="$PROJECT_ROOT/error.log"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
TIME_NOW=$(date +%c)
# build 파일 복사
echo "$TIME_NOW > $JAR_FILE 파일 복사" >> $DEPLOY_LOG
cp $PROJECT_ROOT/build/libs/*.jar $JAR_FILE
# jar 파일 실행
echo "$TIME_NOW > $JAR_FILE 파일 실행" >> $DEPLOY_LOG
nohup java -jar $JAR_FILE > $APP_LOG 2> $ERROR_LOG &
CURRENT_PID=$(pgrep -f $JAR_FILE)
echo "$TIME_NOW > 실행된 프로세스 아이디 $CURRENT_PID 입니다." >> $DEPLOY_LOG
#!/usr/bin/env bash
PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/spring-webapp.jar"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
TIME_NOW=$(date +%c)
# 현재 구동 중인 애플리케이션 pid 확인
CURRENT_PID=$(pgrep -f $JAR_FILE)
# 프로세스가 켜져 있으면 종료
if [ -z $CURRENT_PID ]; then
echo "$TIME_NOW > 현재 실행중인 애플리케이션이 없습니다" >> $DEPLOY_LOG
else
echo "$TIME_NOW > 실행중인 $CURRENT_PID 애플리케이션 종료 " >> $DEPLOY_LOG
kill -15 $CURRENT_PID
fi
jar {
enabled = false
}
# 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://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
name: Deploy to Amazon EC2
on:
push:
branches:
- main
# 본인이 설정한 값을 여기서 채워넣습니다.
# 리전, 버킷 이름, CodeDeploy 앱 이름, CodeDeploy 배포 그룹 이름
env:
AWS_REGION: ap-northeast-2
S3_BUCKET_NAME: my-github-actions-s3-bucket-gary
CODE_DEPLOY_APPLICATION_NAME: my-codedeploy-app
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: my-codedeploy-deployment-group
permissions:
contents: read
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
# 1. 기본 체크아웃
- name: Checkout
uses: actions/checkout@v3
# 2. JDK 17
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
# 3-1. Gradle 권한부여
- name: Grant for Gradle
run: chmod +x gradlew
# 3-2. Gradle build
- name: Build with Gradle
run: ./gradlew clean build
# 4. AWS 인증 (IAM 사용자 Access Key, Secret Key 활용)
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRETS_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
# 5. 빌드 결과물을 S3 버킷에 업로드
- name: Upload to AWS S3
run: |
aws deploy push \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--ignore-hidden-files \
--s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \
--source .
# 6. S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
- name: Deploy to AWS EC2 from S3
run: |
aws deploy create-deployment \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
--s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip
--applicaion-name : CodeDeploy 애플리케이션 이름--s3-location : 압축 파일을 업로드 할 S3 버킷--ignore-hidden-files : 숨김파일도 업로드 할지 여부$GITHUB_SHA : 깃허브에서 매번 커밋할 때 마다 생성하는 랜덤 변수값으로, 파일 업로드시 이름이 중복되어 충돌이 나는 것을 방지한다.appspec.yml 파일에서 선언했던 쉘스크립트를 실행한다.--application-name : CodeDeploy 애플리케이션ㅇ ㅣ름--deployment-config-name : 배포 방식 (default = CodeDeployDefault.AllAtOnce)--deployment-group-name : CodeDeploy 배포 그룹--s3-location : 버킷 이름, 키 값, 번들 타입으로 가져올 파일을 찾는다. 위에서 랜덤 변수를 파일명으로 사용했으므로 충돌이 나지 않는다.