Travis CI는 깃허브에서 제공하는 무료 CI 서비스
젠킨스와 같은 CI 도구도 있지만, 젠킨스는 설치형이기 때문에 이를 위한 EC2 인스턴스가 하나 더 필요
Travis CI에 접속해서 깃허브 계정으로 로그인을 한 뒤, 왼쪽 위에 계정명 > Setting 을 클릭, 그리고 해당 프로젝트를 활성화 시킨다 * Travis CI Web Service 에서 Github 계정 로그인 * Travis Settins 에서 연동할 Github repository 활성화
사진 수정하기!!!!
language: java jdk: openjdk8
branches: only: master
cache: directories:
before_install:
script: "./gradlew clean build"
notifications: email: recipients: - [메일 주소]
* **Travis CI + AWS S3 연동**
* AWS S3는 일종의 파일 서버d
* 정적 파일이나 배포 파일들을 관리하는 기능을 지원하며, 보통 이미지 업로드를 구현한다면 이 S3를 이용하여 구현하는 경우가 많음
![전체적인 구조](/spring-study-week6/01.png)
* IAM 사용자 만들기
* 사용자 세부 정보 설정
* 사용자 이름 > jimmyberg-travis-deploy
* AWS 액세스 유형 선택 > 프로그래밍 방식 액세스
* 권한 설정 및 기존 정책 직접 연결
* AmazonS3FullAccess, AmazonCodeDeployFullAccess 태그 추가
* 키 : Name, 값 : jimmyberg-travis-deploy
* Travis CI에 S3 액세스 키 등록
* 연동한 repository 의 settings 에서 키 등록
* AWS_ACCESS_KEY(액세스 키)
* AWS_SECRET_KEY(비밀 액세스 키)
* .travis.yml 에서 $AWS_ACCESS_KEY, $AWS_SECRET_KEY 으로 사용
* **S3 버킷 생성**
* 버킷 이름 > spring-study
* .travis.yml 수정
... script: "./gradlew clean build"
before_deploy:
deploy: - provider: s3 access_key_id: $AWS_ACCESS_KEY secret_access_key: $AWS_SECRET_KEY
bucket: spring-study
region: ap-northeast-2
skip_cleanup: true
acl: private
local_dir: deploy # 지정한 위치의 파일들만 S3로 전송
wait_until_deployed: true
notifications: ...
![모든 퍼블릭 엑세스 차단](/spring-study-week6/03.png)
![S3 버킷 생성 완료](/spring-study-week6/02.png)
* **Travis CI, S3, CodeDeploy 연동**
* EC2 에 IAM 역할 추가
* EC2 > 인스턴스 설정 > IAM 역할 연결/바꾸기
* ec2-codedeploy-role 역할 선택
* EC2 인스턴스 재부팅
* EC2 에 CodeDeploy agent 설치
$ aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install ./s3 --resion ap-northeast-2
$ cd s3
$ chmod +x ./install
$ sudo ./install auto
$ sudo service codedeploy-agent status
* 연동 설정 파일 추가 및 수정
* EC2 에 zip 파일 저장 디렉토리 생성
$ mkdir /home/ec2-user/s3/zip/rest-api
* appspec.yml 추가
version: 0.0 os : linux files :
destination: /home/ec2-user/s3/zip/rest-api/
overwrite : yes
* .travis.yml 수정
deploy: ...
provider: codedeploy access_key_id: $AWS_ACCESS_KEY secret_access_key: $AWS_SECRET_KEY
bucket: jimmyberg-rest-api key: rest-api.zip bundle_type: zip application: rest-api deployment_group: rest-api-group region: ap-northeast-2 wait_until_deployed: true
* EC2 에 저장된 zip 디렉토리 확인
* **배포 자동화 구성**
* 프로젝트에 deploy.sh 추가
#!/bin/bash
REPOSITORY=/home/ec2-user/apps DEPLOY_DIRECTORY=/home/ec2-user/deploy PROJECT_NAME=rest-api
echo "> Build 파일 복사"
cp $DEPLOY_DIRECTORY/$PROJECT_NAME/*.jar $REPOSITORY/$PROJECT_NAME/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -fl $PROJECT_NAME | 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/$PROJECT_NAME/*.jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
echo "> $JAR_NAME 에 실행권한 추가"
chmod +x $JAR_NAME
echo "> $JAR_NAME 실행"
rm $REPOSITORY/$PROJECT_NAME/nohup.out
nohup java -jar -Dspring.profiles.active=alpha -Dfile.encoding=UTF-8 $JAR_NAME > $REPOSITORY/$PROJECT_NAME/nohup.out 2>&1 &
* .travis.yml 수정
language: java jdk:
branches: only: - master
cache: directories: - '$HOME/.m2/repository' - '$HOME/.gradle'
before_install:
script: "./gradlew clean build"
before_deploy:
deploy:
provider: s3 access_key_id: $AWS_ACCESS_KEY secret_access_key: $AWS_SECRET_KEY bucket: jimmyberg-rest-api region: ap-northeast-2 skip_cleanup: true acl: private local_dir: deploy wait-until-deployed: true
provider: codedeploy access_key_id: $AWS_ACCESS_KEY secret_access_key: $AWS_SECRET_KEY bucket: jimmyberg-rest-api key: rest-api.zip bundle_type: zip application: rest-api deployment_group: rest-api-group region: ap-northeast-2 wait-until-deployed: true
notifications: slack: [slack accesss key]
* appspec.yml 수정
version: 0.0 os : linux files :
permissions:
hooks: ApplicationStart: - location: deploy.sh timeout: 60 runas: ec2-user
* **배포 Log 확인 방법**
* CodeDeploy 관련 Log
$ cd /opt/codedeploy-agent/deploayment-root/ $ vi ./deployment-logs
* 프로젝트 관련 Log
$ cd ~/apps/rest-api/ $ vi ./nohup.out
![EC2에 RDS 접근 확인](/spring-study-week5/mariadb.png)