멋쟁이 프로젝트때 배포 자동화를 끝내지 못했는데 

이번에 새로운 프로젝트를 하면서 배포 자동화를 하게 되었당

 

이전 방법은 거의 동일하게 진행하여 main 브랜치에 push 시 S3에 빌드된 파일이 올라갈 수 있도록 하였다.

 

이제 이 빌드파일을 진짜 배포하고 실행해 볼 것이다.

 

먼저 프로젝트의 루트 경로에 appspec.yml을 작성해주어야 한다.

이 파일은 Code deploy가 수행할 일들을 작성하는 곳이다.

공식 메뉴얼을 참고하여 작성하면 좋을 것 같다.

 

공식 메뉴얼

 

AppSpec '후크' 섹션 - AWS CodeDeploy

배포의 시작 DownloadBundle, 설치 BlockTrafficAllowTraffic, 및 종료 이벤트는 스크립팅할 수 없으므로 이 다이어그램에서 회색으로 표시됩니다. 하지만 파일의 '파일' 섹션을 편집하여 설치 이벤트 중에

docs.aws.amazon.com

 

훅의 실행 순서는 다음과 같다

이를 참고해서 커스텀하게 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

 

 

 

 

 

 

삽질하며 오타들을 수정 후 배포에 성공할 수 있었따 ,, ㅠ-ㅠ 감격의 눈물 도라방스

 

 

 

 

 

 

참고링크

https://ms3864.tistory.com/383

 

github action으로 ec2에 자동배포하기3

https://ms3864.tistory.com/381 github action으로 ec2에 자동배포하기1 우아한테크캠프 마지막 프로젝트 때 나는 자동배포부분을 맡지 않아서 꼭 혼자서 다시 해보고 싶었다. 그리고 삽집도 많이했는데 다

ms3864.tistory.com

https://velog.io/@bambookim/GitHub-Actions-2.-CD%EB%A5%BC-%EC%9C%84%ED%95%9C-Workflow-%EC%83%9D%EC%84%B1

'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
복사했습니다!