CD 구축을 위해 AWS 서비스 중 S3와 CodeDeploy를 사용했다. 추가적으로, 배포 알림을 위해서는 SNS와 Lambda를 사용했다. 그래서 작업은 CD 구축과 배포 알림 작업으로 크게 2가지로 나눠 진행하게 되었다.
구축하고자 하는 CD 과정은 다음과 같다.
S3에는 아래와 같은 파일이 압축되어 업로드 될 것인데, 이를 위한 코드 작업을 먼저 진행한다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/app/deploy/
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: deploy.sh
runas: ubuntu
#!/bin/bash
REPOSITORY_DIR=/home/ubuntu/app
APP_NAME=work-assistant-api
PID_PATH=$REPOSITORY_DIR/PID
SESSION_PROPERTIES=$REPOSITORY_DIR/application-production-session-storage.yaml
THIRD_PARTY_PROPERTIES=$REPOSITORY_DIR/application-thid-party.yaml
DB_PROPERTIES=$REPOSITORY_DIR/application-production-db.yaml
echo "copy executable jar file"
cp $REPOSITORY_DIR/$APP_NAME/build/libs/*.jar $REPOSITORY_DIR
echo "check current pid"
if [ -f $PID_PATH ]; then
PID=$(cat $PID_PATH)
echo "stop current pid $PID"
kill -15 $PID
sleep 10
fi
echo "new application deploy"
echo $(ls -tr $REPOSITORY_DIR | grep .jar | tail -n 1)
JAR_NAME=$(ls -tr $REPOSITORY_DIR/ | grep .jar | tail -n 1)
echo "jar name : $REPOSITORY_DIR/$JAR_NAME"
nohup java -jar \
-Dspring.config.location=classpath:/application.yaml,$SESSION_PROPERTIES,$THIRD_PARTY_PROPERTIES,$DB_PROPERTIES \
-Dspring.profiles.active=production \
$REPOSITORY_DIR/$JAR_NAME 2>&1 & echo $! > $PID_PATH
AWS를 외부 서비스에서 사용하기 위해서는 인증이 필요한데, 이를 위해 IAM(Identity and Access Management)을 생성한다.
각종 파일들을 저장할 저장소인 버킷을 생성한다.
그리고 Jenkins와 S3를 연동하기 위해 플러그인을 설치하고, Connection 설정을 진행한다.
Jenkins에서 빌드 후, 빌드 결과물을 압축한 파일이 S3에 업로드 되도록 스크립트 작성 및 설정을 진행한다.
배포 작업에 대한 구성을 지정해 생성한다.
배포를 진행할 애플리케이션을 생성한다.
이전에 생성한 IAM ARN, API EC2 Name, 배포 설정 값을 올바르게 지정해 배포 그룹을 생성한다.
(AWS 권한 문제로 이후 작업 보류)