7. 자동 배포 Script 작성하기 및 CI/CD 확인해보기
자동배포 script를 작성하기 전에 ubuntu에 경로를 만들어 줄것이다.
mkdir ~/app/step2 && mkdir ~/app/step2/zip
1. appspec.yml 작성하기
프로젝트의 build.gradle과 같은 경로에 appspec.yml을 작성한다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app/step2/zip/
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: deploy.sh
timeout: 60
runas: ubuntu
2. deploy.sh 생성
build.gradle과 같은 경로에 scripts디렉터리를 만들고 그 하위에 deploy.sh를 아래를 참고하여 작성한다.
#!/bin/bash
REPOSITORY=/home/ubuntu/app/step2
PROJECT_NAME= { "프로젝트 명" }
echo "> Build 파일 복사"
cp $REPOSITORY/zip/*.jar $REPOSITORY/
echo "> 현재 구동 중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -f "java -jar $REPOSITORY/$PROJECT_NAME-0.0.1-SNAPSHOT.jar")
echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 애플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/$PROJECT_NAME-0.0.1-SNAPSHOT.jar | tail -n 1)
echo "> JAR NAME: $JAR_NAME"
echo "> $JAR_NAME 에 실행권한 추가"
chmod +x $JAR_NAME
echo "> $JAR_NAME 실행"
nohup java -jar $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
3. WorkFlow yml 작성하기
workFlow의 yml을 아래를 참고하여 작성한다.
name: Java CD with AWS
on:
push:
branches: { "브랜치 명" }
env:
S3_BUCKET_NAME: { "S3 버킷 명" }
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# Github submodule
- name: Checkout repo
uses: actions/checkout@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
submodules: true
# Gradle 유효성 검사
- name: Validate Gradle wrapper
uses: gradle/wrapper-validation-action@ccb4328a959376b642e027874838f60f8e596de3
# Gradle 빌드 & 테스트
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Test with Gradle
run: ./gradlew test
- name: Run the Gradle package task
run: ./gradlew build
# before_deploy 디렉토리 생성
- name: Make Directory
run: mkdir -p before-deploy
# deploy.sh, appspec.yml, jar파일 복사 후, before-deploy 내부의 모든 파일을 압축
- name: Copy files to deploy directory
run: |
cp scripts/*.sh before-deploy/
cp appspec.yml before-deploy/
cp build/libs/*.jar before-deploy/
cd before-deploy && zip -r before-deploy.zip .
cd ../ && mkdir -p deploy
mv before-deploy/before-deploy.zip deploy/{"압축파일 명"}.zip
- 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
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 deploy/{"압축파일 명"}.zip s3://$S3_BUCKET_NAME/
develop:
runs-on: ubuntu-latest
needs: build
steps:
# Deploy
- name: Deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
aws deploy create-deployment \
--application-name github-actions \
--deployment-group-name github-actions-group \
--file-exists-behavior OVERWRITE \
--s3-location bucket={ "S3 버킷 명" },bundleType=zip,key={ "압축 파일 명"}.zip \
--region ap-northeast-2
참고로 application.yml 같은 민감할 수 있는 정보는 GitHub의 Submodule을 사용하여 위와 같이 작성한 것이다.
'GitHub가 없었다면 어떻게 작업을 했을까?' 하는 생각이 들 정도로 개발에 정말 유용한 기능이 많다.
4. 자동 배포 확인해 보기
해당 브랜치로 pull_request 하거나 push를 하면 CI/CD가 진행된다.
build가 완료되었다.
AWS의 CodeDeploy로 가면 배포 진행 상황을 볼 수 있다.
AllowTraffic 단계는 대상 그룹의 상태가 “비정상”으로 체크가 된다면 통과하지 못한다.
AWS의 EC2 ”대상 그룹”에서 확인할 수 있다.
배포가 잘되었다.
'깃 탐구' 카테고리의 다른 글
GitHub Actions) 8. WorkFlows 분할하기 (0) | 2023.08.27 |
---|---|
GitHub Actions) 6. AWS CodeDeploy Application 생성 (0) | 2023.08.26 |
GitHub Actions) 5. EC2 서버 설정하기 (0) | 2023.08.26 |
GitHub Actions) 4. IAM 역할 생성하기 (0) | 2023.08.26 |
GitHub Actions) 3. S3 Bucket 생성하고 업로드하기 (0) | 2023.08.25 |