멋쟁이 프로젝트때 배포 자동화를 끝내지 못했는데
이번에 새로운 프로젝트를 하면서 배포 자동화를 하게 되었당
이전 방법은 거의 동일하게 진행하여 main 브랜치에 push 시 S3에 빌드된 파일이 올라갈 수 있도록 하였다.
이제 이 빌드파일을 진짜 배포하고 실행해 볼 것이다.
먼저 프로젝트의 루트 경로에 appspec.yml을 작성해주어야 한다.
이 파일은 Code deploy가 수행할 일들을 작성하는 곳이다.
공식 메뉴얼을 참고하여 작성하면 좋을 것 같다.
훅의 실행 순서는 다음과 같다
이를 참고해서 커스텀하게 hook 부분을 작성하면 된다.
📌appspec.yml 작성
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app/deploy
file_exists_behavior: OVERWRITE
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
이 appspec에 따라 CodeDeploy의 라이프사이클 중 AfterInstall 시에 stop.sh파일이, ApplicationiStart시에 start.sh 파일이 실행된다.
script는 루트 폴더 경로에 scripts패키지 생성 후 각각 start.sh/stop.sh파일을 만들어 작성한다.
stop.sh는 새로운 배포가 실행되기 전 기존에 실행중인 빌드를 종료하는 역할을 한다.
📌stop.sh 작성
PROJECT_ROOT="/home/ubuntu/app/deploy" # 여기서는 배포할 프로젝트가 위치할 디렉토리
JAR_FILE="$PROJECT_ROOT/webservice-deploy.jar" # 배포할 프로젝트가 빌드된 jar 파일
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"
TIME_NOW=$(date +%c)
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
📌start.sh 작성
PROJECT_ROOT="/home/ubuntu/app/deploy"
JAR_FILE="$PROJECT_ROOT/webservice-deploy.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
그리고 build.gradle파일에 다음을 추가한다.
그 이유는
스프링 2.5 버전 이후부터는 jar파일과 -plain.jar파일도 함께 만들어진다
이때 빌드 시 plain.jar파일은 만들어지지 않도록 build.gradle에 다음 내용을 추가한다.
작은 오타만 있어도 배포가 실패할 수 있기에 만약 에러가 난다면,
ec2 인스턴스에서 에러 로그를 확인해가면서 에러를 잡아준다.
📌에러 로그 확인법
$ tail -F /var/log/aws/codedeploy-agent/codedeploy-agent.log
삽질하며 오타들을 수정 후 배포에 성공할 수 있었따 ,, ㅠ-ㅠ 감격의 눈물 도라방스
참고링크
'etc' 카테고리의 다른 글
EC2환경에서 환경변수 적용하기(ubuntu) (3) | 2024.03.28 |
---|---|
Github Actions를 통한 배포 자동화 (0) | 2023.07.28 |
[프로젝트] redis 적용 (0) | 2023.06.23 |
NoSQL과 RDBMS의 차이 (0) | 2023.06.21 |
Redis란 (0) | 2023.06.19 |