6. CodeDeploy AppSpec 파일 설정 - hoho4190/aws-ec2-cicd-with-github-actions Wiki

CodeDeploy에 고유한 애플리케이션 AppSpec 파일은 YAML 형식 또는 JSON 형식 파일

AppSpec 파일은 파일에 정의된 일련의 수명 주기 이벤트 후크로 각 배포를 관리하는 데 사용

6.1. GitHub 저장소 구조

GitHub 저장소 루트
ㄴscripts
  ㄴcodedeploy
    ㄴAfterInstall.sh
    ㄴApplicationStart.sh
ㄴappspec.yml

6.2. AppSpec 파일 작성

appspec.yml

version: 0.0
os: linux

# sources: GitHub 저장소 기준 배포할 소스 경로
#          소스 전체를 배포하려면 '/', build만 배포하려면 '/build'
#          각자 원하는 폴더나 파일 설정
# destination: 배포받을 EC2 인스턴스 경로
files:
  - source: /
    destination: /home/ec2-user/workspace/aws-cicd
file_exists_behavior: OVERWRITE

# files 섹션의 파일 및 폴더가 인스턴스에 복사된 후 권한 적용
permissions:
  - object: /
    pattern: "**"
    owner: ec2-user
    group: ec2-user

# AfterInstall: 애플리케이션 구성 또는 파일 권한 변경과 같은 작업에 이 배포 수명 주기 이벤트를 사용할 수 있음
# ApplicationStart: 중지된 서비스를 다시 시작하려면 일반적으로 이 배포 수명 주기 이벤트를 사용
# timeout: 선택 사항. 스크립트가 실패로 간주되기 전에 실행할 수 있는 기간(초). 기본값은 3600초(1시간)
# runas: 선택 사항. 스크립트 실행 시 가장하는 사용자.
hooks:
  AfterInstall:
    - location: scripts/codedeploy/AfterInstall.sh
      timeout: 60
      runas: ec2-user
  ApplicationStart:
    - location: scripts/codedeploy/ApplicationStart.sh
      timeout: 60
      runas: ec2-user

6.3. hook script

6.3.1. AfterInstall shell script

plain jar 파일을 제외하고 최신 버전의 jar 파일을 aws-cicd.jar로 복제

AfterInstall.sh

# !/bin/bash
JAR_PATH=/home/ec2-user/workspace/aws-cicd/build/libs
SERVICE_JAR_NAME=aws-cicd.jar

latest_jar=$(ls -I *-plain.jar $JAR_PATH | sort -V | tail -n 1)
cp $JAR_PATH/$latest_jar $JAR_PATH/$SERVICE_JAR_NAME

6.3.2. ApplicationStart shell script

aws-cicd 서비스 재시작

ApplicationStart.sh

# !/bin/bash
SERVICE_NAME=aws-cicd
sudo systemctl restart $SERVICE_NAME