깃 엑션 탭에 들어가서 깃엑션을 시작하고 yml파일을 만든다.
1) deploy.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" ]
permissions:
contents: read
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'
## create application-secret.properties 중요 properties 숨기기!
- name: make application-secret.properties
run: |
cd ./src/main/resources
touch ./application-secret.properties
echo "${{ secrets.PROPERTIES_SECRET }}" > ./application-secret.properties
shell: bash
- name: Build with Gradle
run: chmod +x ./gradlew
- uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
with:
arguments: 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_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
# cloud-aws-credentials-accessKey : ${{ secrets.AWS_ACCESS_KEY_ID }}
# cloud-aws-credentials-secretKey : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# (5) 빌드 결과물을 S3 버킷에 업로드
- name: Upload to AWS S3
run: |
aws deploy push \
--application-name testapp \
--ignore-hidden-files \
--s3-location s3://magorosc/$GITHUB_SHA.zip \
--source .
# (6) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
- name: Deploy to AWS EC2 from S3
run: |
aws deploy create-deployment \
--application-name testapp \
--deployment-config-name CodeDeployDefault.OneAtATime \
--deployment-group-name dev \
--s3-location bucket=magorosc,key=$GITHUB_SHA.zip,bundleType=zip
2) 깃의 Settings -> Secrets -> Actions로 이동
secret 만들기:
AWS_ACCESS_KEY_ID : 사전에 생성해둔 iam의 시크릿 id를 value로 해서 만든다.
AWS_SECRET_ACCESS_KEY : 사전에 생성해둔 iam의 시크릿 pw를 value로 해서 만든다.
PROPERTIES_SECRET: 기존에 숨기고싶었던(gitignore) application-secret.properties내의 정보를 value로 넣는다.
3) 루트경로에 appspec.yml 만들기
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
AfterInstall:
- location: stop.sh
timeout: 60
runas: ubuntu
ApplicationStart:
- location: start.sh
timeout: 60
runas: ubuntu
4) start.sh 만들기:
#!/usr/bin/env bash
PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/build/libs/CookBank-0.0.1-SNAPSHOT.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
# 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
5) stop.sh 만들기:
#!/usr/bin/env bash
PROJECT_ROOT="/home/ubuntu/app"
JAR_FILE="$PROJECT_ROOT/*SNAPSHOT.jar.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
로그파일에서 (application.log) 포트번호가 사용중이라는 오류가 뜬다면 ps -ef | grep java로 프로세스 번호 확인 후
kill -9 프로세스번호로 종료하고 nohup java -jar 파일명.jar &으로 다시 실행해보기
코드부분은 먼저 완료하신 성우님의 코드를 많이 참고하였다.
추가로 참고한 자료: https://zzang9ha.tistory.com/404
GitHub-Actions로 CI/CD 구축하기(AWS, Docker, SpringBoot)
GitHub-Actions로 CI/CD 구축하기(AWS, Docker, SpringBoot) 안녕하세요, 이번 시간에는 GitHub-Actions로 CI/CD를 구축하는 방법에 대해 알아보겠습니다. 해당 포스팅이 CI/CD를 전체적으로 포함하고 있기는..
zzang9ha.tistory.com