https://brilliantdevelop.tistory.com/171에 이어
Travis CI, S3, CodeDeploy를 연동해
실제 배포와 배포자동화까지 하도록 하겠습니다.
Travis CI, S3, CodeDeploy 연동
먼저 S3에서 넘겨줄 zip 파일을 저장할 디렉토리를 하나 생성하겠습니다.
EC2서버에 접속해서 다음과 같이 디렉토리를 생성합니다.
mkdir ~/app
mkdir ~/app/ch && mkdir ~/app/ch/zip
Travis CI의 Build가 끝나면 S3에 zip파일이 전송되고, 이 zip파일은
/home/ec2-user/app/ch/zip으로 복사되어 압축을 풀 예정입니다.
AWS CodeDeploy의 설정은 appspec.yml로 진행합니다.
appespec.yml도 프로젝트 상단에 위치해야 합니다.
appspec.yml을 다음과 같이 작성합니다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/app/ch/zip/
overwrite: yes
.travis.yml 파일도 다음과 같이 codedeploy부분을 추가해줍니다.
language: java
jdk:
- openjdk11
branches:
only:
- master
# Travis CI 서버의 Home
cache:
directories:
- '$HOME/.m2/repository'
- '$HOME/.gradle'
script: "./gradlew clean build"
before_install:
- chmod +x gradlew
# CI 실행 완료시 메일로 알람
notifications:
email:
recipients:
- gks9306202@gmail.com
before_deploy:
- zip -r changhee * # AWS에서의 무언가가 아닌 내 프로젝트이름
- mkdir -p deploy
- mv changhee.zip deploy/changhee.zip # 파일이름도 프로젝트이름 .
deploy:
- provider: s3
access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
bucket: ch-build # S3 버킷
region: ap-northeast-2
skip_cleanup: true
acl: private # zip 파일 접근을 private으로
local_dir: deploy # before_deploy에서 생성한 디렉토리
wait-until-deployed: true
#추가된부분
- provider: codedeploy
on:
all_branches: true
access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
bucket: ch-build # S3 버킷
key: changhee.zip # 빌드 파일을 압축해서 전달 ( Travis에서 빌드하고 S3에 저장된 빌드파일 이름
bundle_type: zip
application: ch # 웹 콘솔에서 등록한 CodeDeploy 어플리케이션
deployment_group: ch-group # 웹 콘솔에서 등록한 CodeDeploy 배포 그룹
region: ap-northeast-2
wait-until-deployed: true
모든 내용을 작성했다면 프로젝트를 커밋하고 푸시합니다.
깃허브로 푸시되면 Travis CI가 자동으로 빌드를 시작하고
(깃허브 변경 인식 후 빌드 시작까지 1분정도 소요시간 있음)
CodeDeploy가 배포까지 완료합니다.
문제없이 진행됐다면 Travis CI와 CodeDeploy에서
다음과 같이 성공화면이 보일 것입니다.
Travis CI
CodeDeploy
배포가 완료됐다면 EC2에 빌드된 파일이 잘 도착했는지 확인해봅시다.
EC2에서 다음의 명령어를 입력합니다.
cd /home/ec2-user/app/ch/zip
ll
다음과 같이 프로젝트 파일들이 잘 도착했으면 성공입니다.
여기까지했다면 Travis CI, S3, CodeDeploy 연동까지 성공한 것입니다.
배포 및 배포자동화
이제 연동된 Travis CI,S3, CodeDeploy를
기반으로 Jar를 배포하여 실행까지 해보겠습니다.
deploy.sh
먼저 scripts 디렉토리를 만든 후 여기에 deploy.sh를 생성합니다.
deploy.sh의 내용은 다음과 같습니다.
#!/bin/bash
REPOSITORY=/home/ec2-user/app/ch
PROJECT_NAME=changhee
echo "> Build 파일 복사"
cp $REPOSITORY/zip/*.jar $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -fl ch | grep jar | awk '{print $1}')
echo "현재 구동중인 어플리케이션 pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> 새 어플리케이션 배포"
JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
echo "> $JAR_NAME 에 실행권한 추가"
chmod +x $JAR_NAME
echo "> $JAR_NAME 실행"
nohup java -jar \
-Dspring.config.location=classpath:/application.properties,classpath:/application-real.properties,/home/ec2-user/app/application-real-db.properties \
-Dspring.profiles.active=real \
$JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
.travis.yml
현재는 프로젝트의 모든파일을 zip파일로 만드는데,
실제로 필요한 파일들은 Jar, appsepc.yml, 배포 스크립트입니다.
이외의 나머지는 필요하지않으니 포함하지 않습니다.
language: java
jdk:
- openjdk11
branches:
only:
- master
# Travis CI 서버의 Home
cache:
directories:
- '$HOME/.m2/repository'
- '$HOME/.gradle'
script: "./gradlew clean build"
before_install:
- chmod +x gradlew
# CI 실행 완료시 메일로 알람
notifications:
email:
recipients:
- gks9306202@gmail.com
before_deploy: #before_deploy만 변경됨
- mkdir -p before-deploy # zip에 포함시킬 파일들을 담을 디렉토리 생성
- cp scripts/*.sh before-deploy/
- cp appspec.yml before-deploy/
- cp build/libs/*.jar before-deploy/
- cd before-deploy && zip -r before-deploy * # before-deploy로 이동후 전체 압축
- cd ../ && mkdir -p deploy # 상위 디렉토리로 이동후 deploy 디렉토리 생성
- mv before-deploy/before-deploy.zip deploy/changhee.zip # deploy로 zip파일 이동
deploy:
- provider: s3
access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
bucket: ch-build # S3 버킷
region: ap-northeast-2
skip_cleanup: true
acl: private # zip 파일 접근을 private으로
local_dir: deploy # before_deploy에서 생성한 디렉토리
wait-until-deployed: true
#추가된부분
- provider: codedeploy
on:
all_branches: true
access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값
secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값
bucket: ch-build # S3 버킷
key: changhee.zip # 빌드 파일을 압축해서 전달 ( Travis에서 빌드하고 S3에 저장된 빌드파일 이름
bundle_type: zip
application: ch # 웹 콘솔에서 등록한 CodeDeploy 어플리케이션
deployment_group: ch-group # 웹 콘솔에서 등록한 CodeDeploy 배포 그룹
region: ap-northeast-2
wait-until-deployed: true
appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/app/ch/zip/
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
hooks:
ApplicationStart:
- location: deploy.sh
timeout: 60
runas: ec2-user
이제 인스턴스의 개방주소에 8080포트를붙여서 접속해보면
프로젝트의 첫 화면을 볼 수 있다.
여기까지 잘 되었다면 프로젝트 수정 후 깃허브에 commit/push만 하면
약간의 시간( 빌드하고 배포하기까지) 후
수정된 프로젝트의 서비스를 웹에서 접근가능하게된다.
(지금은 AWS에 EC2를 종료한 상태라 접속 불가한 상태입니다.)