CICD 자동화 구현을 통해 Spring-boot 프로젝트 배포
- 로컬에서 Github로 코드 Push
- Github Action에서 Push 이벤트를 캐치해 Workflow 실행
- Workflow에서 S3로 프로젝트 업로드 및 CodeDeploy로 배포 요청
- CodeDeploy에서 S3에서 받은 프로젝트를 EC2로 배포
- IAM 계정 생성 및 권한 부여
- IAM 계정 키페어 발급 및 Github에 입력
- IAM 계정에 역할 생성
- AWS EC2 세팅
1) EC2 인스턴스 생성
2) 보안그룹 설정
3) EIP 생성 및 연결
4) IAM 역할 연결
5) 윈도우 터미널에서 ssh로 EC2에 접속
6) CodeDeploy agent 설치
7) Java 설치- AWS S3 세팅
- AWS CodeDeploy 세팅
- Github Actions 세팅
- 배포 후 실행할 스크립트 작성
1) appspec.yml 작성
2) 실행 스크립트 작성- 배포 진행
- 트러블 슈팅
참고
EC2 인스턴스 생성시에는 외부 도메인에서 접근할 수 있는 IP 주소가 할당되어 있지 않다. EIP(탄력적 IP, 고정 IP)를 생성해 EC2 인스턴스와 연결해 주면 해당 IP를 통해 외부 도메인에서 EC2에 접근할 수 있다.
아래 링크에서 윈도우 터미널 설치
https://learn.microsoft.com/ko-kr/windows/terminal/install
EC2 키페어 생성
Home 디렉토리에 .ssh폴더 만들고 PEM파일과 Config파일 넣기
(Home 디렉토리 찾는 방법 : 윈도우 터미널에서 cd ~ 명령어 입력)
Config 파일에 EC2에 접속하기 위한 정보 입력
윈도우 터미널에서 SSH 명령어로 EC2에 접속
sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto > /tmp/logfile
sudo apt update
sudo apt install openjdk-17-jdk
Workflow 작성
name: CICD Test
run-name: Running
on:
push:
branches:
- master
env:
AWS_REGION: ap-northeast-2
AWS_S3_BUCKET: hellospringbucket
AWS_CODE_DEPLOY_APPLICATION: cicd-test-CD
AWS_CODE_DEPLOY_GROUP: cicd-test-CD-group
jobs:
build-with-gradle:
runs-on: ubuntu-20.04
steps:
- name: master 브랜치로 이동
uses: actions/checkout@v3
with:
ref: master
- name: JDK 17 설치
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'corretto'
- name: gradlew에 실행 권한 부여
run: chmod +x ./gradlew
- name: 프로젝트 빌드
run: ./gradlew clean build -x test
- name: AWS credential 설정
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ${{ env.AWS_REGION }}
aws-access-key-id: ${{ secrets.CICD_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.CICD_SECRET_KEY }}
- name: S3에 업로드
run: aws deploy push --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --ignore-hidden-files --s3-location s3://$AWS_S3_BUCKET/cicdtest/$GITHUB_SHA.zip --source .
- name: EC2에 배포
run: aws deploy create-deployment --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }} --s3-location bucket=$AWS_S3_BUCKET,key=cicdtest/$GITHUB_SHA.zip,bundleType=zip
프로젝트의 루트 경로에 appspec.yml 작성
배포 위치와 배포 과정에서 실행할 스크립트 정보를 기입한다
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/SpringCore-Extention
overwrite: yes
permissions:
- object: /
owner: ubuntu
group: ubuntu
hooks:
AfterInstall:
- location: scripts/stop.sh
timeout: 60
ApplicationStart:
- location: scripts/start.sh
timeout: 60
#!/bin/bash
ROOT_PATH="/home/ubuntu/SpringCore-Extention"
JAR="$ROOT_PATH/application.jar"
STOP_LOG="$ROOT_PATH/stop.log"
SERVICE_PID=$(pgrep -f $JAR) # 실행중인 Spring 서버의 PID
if [ -z "$SERVICE_PID" ]; then
echo "서비스 NouFound" >> $STOP_LOG
else
echo "서비스 종료 " >> $STOP_LOG
kill "$SERVICE_PID"
# kill -9 $SERVICE_PID # 강제 종료를 하고 싶다면 이 명령어 사용
fi
#!/bin/bash
ROOT_PATH="/home/ubuntu/SpringCore-Extention"
JAR="$ROOT_PATH/application.jar"
APP_LOG="$ROOT_PATH/application.log"
ERROR_LOG="$ROOT_PATH/error.log"
START_LOG="$ROOT_PATH/start.log"
NOW=$(date +%c)
echo "[$NOW] $JAR 복사" >> $START_LOG
cp $ROOT_PATH/build/libs/application.jar $JAR
echo "[$NOW] > $JAR 실행" >> $START_LOG
nohup java -jar $JAR > $APP_LOG 2> $ERROR_LOG &
SERVICE_PID=$(pgrep -f $JAR)
echo "[$NOW] > 서비스 PID: $SERVICE_PID" >> $START_LOG
Github로 커밋을 push하면 배포가 진행된다
EC2에 Spring-boot 전송 및 jar파일 생성된 것 확인
접속 확인
오류원인
codedeploy-agent에 해당 역할을 수행할 IAM 자격증명이 존재하지 않기 때문에 발생. EC2에 역할 연결을 하기 전에 codedeploy-agent를 세팅했기 때문에 발생한 문제.
오류해결
sudo service codedeploy-agent restart
codedeploy-agent 재시작
오류원인
디렉토리 및 jar파일명 오표기로 인한 오류
오류해결