https://realyun99.tistory.com/entry/CICD-EC2-CodePipeline-Test-1
https://realyun99.tistory.com/entry/CICD-EC2-CodePipeline-Test-2
지금까지 수동 배포를 해보고 수동을 자동화 하는 방법에 대해 알아 봤습니다. 2번 포스팅에서 GithubAction을 활용했다면 이번 포스팅에선 CodeSeries를 사용해 CodePipeline 구성을 해보겠습니다.
* github, codebuild, codedeploy, codepipeline 활용
프로젝트 소스의 경우 1번 포스팅에서 진행했던 spring boot 를 활용합니다.
buildspec.yml 작성
version: 0.2
phases:
install:
runtime-versions:
java: corretto21 # Java 21 버전
build:
commands:
- echo Build Starting on `date`
- chmod +x ./gradlew
- ./gradlew build
post_build:
commands:
- echo $(basename ./build/libs/*.jar)
- pwd
artifacts:
files:
- appspec.yml
- build/libs/*.jar
- scripts/**
discard-paths: yes
cache:
paths:
- '/root/.gradle/caches/**/*'
프로젝트 폴더의 최상단에 buildspec.yml을 넣고 위 코드를 입력합니다.
appspec.yml 작성
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/app/
overwrite: yes
file_exists_behavior: OVERWRITE
# ApplicationStart 단계에서 deploy.sh를 실행시키도록 합니다.
hooks: # CodeDeploy배포 단계에서 실행할 명령어를 지정합니다.
ApplicationStart: # deploy.sh를 root권한으로 실행합니다.
- location: deploy.sh
timeout: 300 # 스크립트 실행 300초 이상 수행되면 실패가 됩니다.
runas: root
프로젝트 폴더의 최상단에 appspec.yml을 넣고 위 코드를 입력합니다.
deploy.sh 작성
#!/bin/bash
#BUILD_JAR=$(ls /home/ec2-user/app/build/libs/*.jar)
BUILD_JAR=$(ls /home/ec2-user/app/*.jar)
JAR_NAME=$(basename $BUILD_JAR)
echo "> build cicd-test: $JAR_NAME" >> /home/ec2-user/app/deploy.log
echo "> build 파일 복사" >> /home/ec2-user/app/deploy.log
DEPLOY_PATH=/home/ec2-user/
cp $BUILD_JAR $DEPLOY_PATH
echo "> cicd-test.jar 교체"
CP_JAR_PATH=$DEPLOY_PATH$JAR_NAME
APPLICATION_JAR_NAME=cicd-test.jar
APPLICATION_JAR=$DEPLOY_PATH$APPLICATION_JAR_NAME
ln -Tfs $CP_JAR_PATH $APPLICATION_JAR
echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ec2-user/app/deploy.log
CURRENT_PID=$(pgrep -f $APPLICATION_JAR_NAME)
if [ -z $CURRENT_PID ]
then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> /home/ec2-user/app/deploy.log
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> $APPLICATION_JAR 배포" >> /home/ec2-user/app/deploy.log
nohup java -jar $APPLICATION_JAR >> /home/ec2-user/deploy.log 2>/home/ec2-user/app/deploy_err.log &
프로젝트에 scripts 폴더를 생성하고 위 코드를 넣어줍니다.
CodePipeline 구성
나머진 디폴트로 설정합니다. (아티팩트도 기본 설정으로)
소스는 GitHub을 연결해줍니다.
소스 트리거는 본인이 push하는 브랜치로 설정합니다.
빌드는 CodeBuild를 선택하고 프로젝트를 생성합니다.
새 창이 열리며 위와 같이 build 프로젝트 생성을 시작합니다.
설정이 끝났으면 CodePipeline으로 계속 버튼을 누르고 이어 진행합니다.
다음 버튼 클릭해 배포 단계 구성 합니다.
CodeDeploy의 경우 2번 포스팅에서 생성했던 애플리케이션에 새로운 배포 그룹을 만들어 진행합니다.
프로젝트를 배포할 인스턴스 이름 태그를 걸어줍니다.
로드밸런싱 비활성화를 누른 뒤 배포 그룹 생성합니다.
2번 포스팅에서 생성했던 애플리케이션과 위에서 생성했던 배포 그룹을 선택합니다.
검토 후 파이프라인을 생성합니다.
❗ codedeloy agent 에러 확인 ❗
cd /var/log/aws/codedeploy-agent
cat codedeploy-agent.log
appspec.yml 파일에 아래 코드 추가
file_exists_behavior: OVERWRITE
❗ SNAPSHOT-plain.jar 와 SNAPSHOT.jar 중 SNAPSHOT.jar만 실행 가능한 아카이브 ❗
SNAPSHOT-plain.jar를 생성하지 못하게 아래 코드를 build.gradle에 추가해준다.
jar {
enabled = false
}
'Toy Project' 카테고리의 다른 글
[CI/CD] EC2 CodePipeline Test -2 (1) | 2024.03.19 |
---|---|
[CI/CD] EC2 CodePipeline Test -1 (0) | 2024.03.18 |