Travis CI로 지속적인 배포환경 구성
테스트 빌드 자동화 과정
Travis CI에 접속하여 Github 계정으로 로그인한다.
Github 저장소를 검색하여 활성화시킨다.
프로젝트 설정
language: java
jdk:
- openjdk8
branches:
only:
- master
# Travis CI 서버의 Home
cache:
directories:
- "$HOME/.m2/repository"
- "$HOME/.gradle"
script: "./gradlew clean build"
# CI 실행 완료시 메일로 알람
notifications:
email:
recipients:
- xxx@gmail.com
-
권한 문제로 에러 발생 시 추가
before_install: - chmod +x gradlew
commit 후 push 하면 build history/Email에서 성공여부를 확인 할 수 있다.
Travis CI 라벨 추가
빌드를 확인했던 화면에서 우측 상단의 build/(unknown) 라벨을 클릭하면 모달이 나온다.
모달에서 markdown을 선택하고 아래의 코드를 복사하여 라벨이 나오길 원하는 위치(README.md)에 추가한다.
- 테스트와 빌드까지의 자동화를 마쳤지만 아직 배포까지 자동화를 하지못했다.
AWS Code Deploy 연동
-
TravisCI로 Build된 파일을 EC2 인스턴스로 전달하기 위해 AWS CodeDeploy를 사용한다.
-
과정
IAM 추가
- AWS IAM 서비스에 사용자를 추가(프로그래밍 방식 엑세스)
- 사용 정책은 기존 정책의 CodeDeploy와 S3 권한만 할당
- 완성되면 엑세스키와 secret키가 생성되고 .csv 파일로 저장한다.
S3 버킷 생성
- Build된 jar파일을 보관할 S3버킷을 생성한다.
IAM Role 추가
- key를 사용해 기능을 진행 할 IAM Role을 추가한다.(EC2, CodeDeploy)
- IAM - 역할 - 역할 만들기
##EC2
- 사용사례선택 -> EC2
- 권한정책 연결 -> AmazonEC2RoleforAWSCodeDeploy
##CodeDeploy
- 사용사례선택 -> CodeDeploy
- 권한정책 연결 -> AWSCodeDeployRole
EC2에 Code Deploy Role 추가
- EC2 인스턴스에서 IAM 역할 연결/바꾸기
EC2에 CodeDeploy Agent 설치
- EC2에 ssh 접속 후 aws-cli 설치
sudo yum -y update
sudo yum install -y aws-cli
- 설치 후 인스턴스에서 아래 과정 진행
cd /home/ec2-user
sudo aws configure
region : ap-northeast-2 / output : json 을 입력한다.
- AWS Code Deploy CLI 설치
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
실행권한 부여
chmod +x ./install
설치 & 실행
sudo ./install auto
Agent 실행 확인
sudo service codedeploy-agent status
- EC2 인스턴스가 부팅되면 자동으로 AWS CodeDeploy Agent가 실행될 수 있도록 /etc/init.d/에 쉘 스크립트 파일 생성
sudo vim /etc/init.d/codedeploy-startup.sh
(리눅스에서 /etc/init.d/ 에 스크립트가 있으면 부팅시 자동실행)
#!/bin/bash
echo 'Starting codedeploy-agent'
sudo service codedeploy-agent start
.travis.yml & appspec.yml 설정
AWS S3 : Travis CI가 Build 한 결과물을 받아서 CodeDeploy가 가져갈 수 있도록 보관할 수 있는 공간
-
travis.yml에 아래 내용 추가
deploy: - provider: s3 access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값 secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값 bucket: springboot-webservice-deploy # 6-3-3에서 생성한 S3 버킷 region: ap-northeast-2 skip_cleanup: true acl: public_read wait-until-deployed: true on: repo: (name)/springboot-webservice #Github 주소 branch: master
-
$AWS_ACCESS_KEY , $AWS_SECRET_KEY 추가
Travis CI의 저장소 Settings - Environment Variables 에 받은 키 값 등록
연동 확인
-현재 까지의 내용을 commit 후 push
(S3 Bucket에 접근할 수 없어 deploy가 실패 되었다 - Bucket 권한에서 새 ACL에 대한 접근을 허용하니 성공!)
프로젝트 압축하여 Bucket에 올리기
- 아래 설정을 추가
...
before_deploy:
- zip -r springboot-webservice *
- mkdir -p deploy
- mv springboot-webservice.zip deploy/springboot-webservice.zip
deploy:
- provider: s3
...
local_dir: deploy # before_deploy에서 생성한 디렉토리
...
Travis CI & S3 & CodeDeploy 연동
-
AWS CodeDeploy 이동 - 애플리케이션 생성 (컴퓨팅 플랫폼 - EC2/온프레미스 / 배포유형 - 현재위치)
-
모든 설정 후 EC2에 ssh 접속후 zip을 받아올 디렉토리 생성
mkdir /home/ec2-user/app/travis mkdir /home/ec2-user/app/travis/build
-
프로젝트에 CodeDeploy 설정 파일 작성 (appspec.yml)
version: 0.0 ##CodeDeploy Version os: linux files: - source: / ##Bucket의 복사할 파일 위치 destination: /home/ec2-user/app/travis/build/ ##Bucket zip 파일의 압축을 풀 위치
-
.travis.yml 설정 추가
- provider: codedeploy access_key_id: $AWS_ACCESS_KEY # Travis repo settings에 설정된 값 secret_access_key: $AWS_SECRET_KEY # Travis repo settings에 설정된 값 bucket: springboot-webservice-deploy # S3 버킷 key: springboot-webservice.zip # 빌드 파일을 압축해서 전달 bundle_type: zip application: springboot-webservice # 웹 콘솔에서 등록한 CodeDeploy 어플리케이션 deployment_group: springboot-webservice-group # 웹 콘솔에서 등록한 CodeDeploy 배포 그룹 region: ap-northeast-2 wait-until-deployed: true on: repo: name/springboot-webservice branch: master
-
commit & push
CodeDeploy로 스크립트 실행
-
스크립트로 배포된 jar파일을 실행까지 진행
-
jar파일을 모아둘 디렉토리 생성
mkdir /home/ec2-user/app/travis/jar
-
jar를 실행할 deploy.sh 작성
vim /home/ec2-user/app/travis/deploy.sh
#!/bin/bash REPOSITORY=/home/ec2-user/app/travis echo "> 현재 구동중인 애플리케이션 pid 확인" CURRENT_PID=$(pgrep -f springboot-webservice) echo "$CURRENT_PID" if [ -z $CURRENT_PID ]; then echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." else echo "> kill -15 $CURRENT_PID" kill -15 $CURRENT_PID sleep 5 fi echo "> 새 어플리케이션 배포" echo "> Build 파일 복사" cp $REPOSITORY/build/build/libs/*.jar $REPOSITORY/jar/ JAR_NAME=$(ls $REPOSITORY/jar/ |grep 'spring-webservice' | tail -n 1) echo "> JAR Name: $JAR_NAME" nohup java -jar $REPOSITORY/jar/$JAR_NAME &
-
deploy.sh 스크립트 확인
/home/ec2-user/app/travis/deploy.sh
-
appspec.yml 에 설정 추가
hooks: AfterInstall: # 배포가 끝나면 아래 명령어를 실행 - location: execute-deploy.sh timeout: 180
-
CodeDeploy에서 접근할 excute-delpoy.sh 작성
/프로젝트 루트
#!/bin/bash /home/ec2-user/app/travis/deploy.sh > /dev/null 2> /dev/null < /dev/null &
-
commit & push
-
정리
local push to Github - test/build(Travis) - deploy to Bucket(Travis) - deploy to EC2(CodeDeploy) - jar 구동 script 실행(CodeDeploy)
-
참고 - 스프링부트로 웹 서비스 출시하기 https://jojoldu.tistory.com/
Leave a comment