Travis CI는 깃허브에서제공하는 무료 CI 서비스입니다.
Travis CI Web Service에서 깃허브 계정으로 로그인 후 설정창 이동
travis 설정창 이동
깃허브 저장소 활성화
깃허브 저장소 빌드 목록
Travis CI의 상세한 설정은 프로젝트에 존재하는 .travis.yml 파일로 할 수 있습니다.
프로젝트의 build.gradle과 같은 위치에서 .travis.yml을 생성한 후 다음의 코드를 작성한다.
.travis.yml 작성
language: java jdk: - openjdk8 branches: only: - master # Travis CI 서버의 Home cache: directories: - '$HOME/.m2/repository' - '$HOME/.gradle' before_install: - chmod +x gradlew script: "./gradlew clean build" # CI 실행 완료 시 메일로 알람 notifications: email: recipients: - 본인 메일 주소
master Push시 Travis CI 자동 실행
Travis CI 실행 알람 수신
S3란 AWS에서 제공하는 일종의 파일 서버입니다. 이미지 파일을 비롯한 정적 파일들을 관리하거나 배포 파일들을 관리하는
등의 기능을 지원합니다.
S3를 비롯한 AWS 서비스와 Travis CI 연동 전체 구조
AWS 서비스에 외부 서비스가 접근할 수 없습니다. 그러므로 접근 가능한 권한을 가진 Key를 생성
IAM(Identiry and Access Management)은 AWS에서 제공하는 서비스의 접근 방식과 권한을 관리합니다.
IAM 사용자 추가
사용자 세부 정보 설정
S3 권한 CodeDeploy 권한 추가
태그 추가
검토
엑세스키 확인
TravisCI의 환경변수 셋팅
여기서 등록된 값들은 이제 .travis.yml에서 $AWS_ACCESS_KEY, $AWS_SECRET_KEY란 이름으로 사용할 수 있습니다.
AWS의 S3서비스는 일종의 파일 서버입니다. 순수하게 파일들을 저장하고 접근 권한을 관리, 검색 등을 지원하는 파일 서버의 역할을 합니다.
버킷 만들기
버킷 이름 짓기
모든 퍼블릭 엑세스 차단
버킷 생성 완료
.travis.yml 추가
language: java jdk: - openjdk8 branches: only: - master # Travis CI 서버의 Home cache: directories: - '$HOME/.m2/repository' - '$HOME/.gradle' before_install: - chmod +x gradlew script: "./gradlew clean build" before_deploy: - zip -r springboot-webservice ./* - mkdir -p deploy - mv springboot-webservice.zip deploy/springboot-webservice.zip deploy: - provider: s3 access_key_id: $AWS_ACCESS_KEY secret_access_key: $AWS_SECRET_KEY bucket: swchoi-springboot-build region: ap-northeast-2 skip_cleanup: true acl: private local_dir: deploy wait_until_deployed : true # CI 실행 완료 시 메일로 알람 notifications: email: recipients: - b088081@gmail.com
Travis CI 빌드 성공
S3 업로드 성공
IAM 역할 만들기
서비스 선택
정책 선택
태그 추가
검토
역할 만들기 완료
EC2 IAM 역할 변경하기
IAM 역할 선택
EC2 재부팅
EC2 접속 CodeDeploy 에이전트 설치
실행 권한 추가
chomd +x ./install
install 파일 설치
sudo ./install auto
Agent 상태 검사
sudo service codedeploy-agent status
IAM 역할 CodeDeploy 서비스 선택
권한 선택
태그 추가
검토 후 역할 만들기
CodeDeploy는 AWS의 배포 삼형제 중 하나입니다.
CodeDeploy 생성
CodeDeploy 구성 선택
배포 그룹 생성
그룹 권한 입력
배포 유형
배포할 서비스가 2대 이상이라면 블루/그린을 선택
환경 설정
배포 설정
배포 구성이란 한번 배포할 때 몇 대의 서버에 배포할지를 결정합니다. 2대 이상이라면 1대씩 배포할지, 30% 혹은 50%로 나눠서 배포할지 등등 여러 옵션을 사용할 수 있다.
배포 그룹 생성 완료
S3에서 넘겨줄 zip 파일을 저장할 디렉토리 생성
EC2 디렉토리 생성
mkdir ~/app/step2 && mkdir ~/app/step2/zip
AWS CodeDeploy의 설정은 appspec.yml로 진행합니다.
appspec.yml
version: 0.0 os : linux files : - source : / destination: /home/ec2-user/app/step2/zip/ overwrite : yes
.travis.yml
... deploy: ... - provider: codedeploy access_key_id: $AWS_ACCESS_KEY secret_access_key: $AWS_SECRET_KEY bucket: swchoi-springboot-build key : springboot-webservice.zip bundle_type : zip application : springboot-webservice deplyment_group : springboot-webservice-group region: ap-northeast-2 wait-until-deployed : true
CodeDeploy 성공
EC2 확인
cd /home/ec2-user/app/step2/zip ll
deploy.sh
#!/bin/bash REPOSITORY=/home/ec2-user/app/step2 PROJECT_NAME=springboot-webservice echo "> Build 파일 복사" cp $REPOSITORY/zip/*.jar $REPOSITORY/ 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/*.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-oauth.properties,/home/ec2-user/app/application-real-db.properties \ -Dspring.profiles.active=real \ $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
CURRENT_PID
$JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
.travis.yml
language: java jdk: - openjdk8 branches: only: - master # Travis CI 서버의 Home cache: directories: - '$HOME/.m2/repository' - '$HOME/.gradle' before_install: - chmod +x gradlew script: "./gradlew clean build" before_deploy: - mkdir -p before-deploy - cp scripts/*.sh before-deploy/ - cp appspec.yml before-deploy/ - cp build/libs/*.jar before-deploy/ - cd before-deploy && zip -r before-deploy * - cd ../ && mkdir -p deploy - mv before-deploy/before-deploy.zip deploy/springboot-webservice.zip deploy: - provider: s3 access_key_id: $AWS_ACCESS_KEY secret_access_key: $AWS_SECRET_KEY bucket: swchoi-springboot-build 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: swchoi-springboot-build key : springboot-webservice.zip bundle_type : zip application : springboot-webservice deployment_group : springboot-webservice-group region: ap-northeast-2 wait-until-deployed : true # CI 실행 완료 시 메일로 알람 notifications: email: recipients: - b088081@gmail.com
appspec.yml
version: 0.0 os : linux files : - source : / destination: /home/ec2-user/app/step2/zip/ overwrite : yes permissions: - object: / pattern: "**" owner: ec2-user group: ec2-user hooks: ApplicationStart: - location : deploy.sh timeout: 60 runas: ec2-user
cd /opt/codedeploy-agent/deploayment-root/
ll
drwxr-xr-x 2 root root 4096 Mar 26 22:47 deployment-instructions
drwxr-xr-x 2 root root 4096 Mar 26 21:44 deployment-logs
drwxr-xr-x 7 root root 4096 Mar 26 22:47 fde8b9de-07b8-48e2-ad25-aa46d16aad78
drwxr-xr-x 2 root root 4096 Mar 26 22:47 ongoing-deployment
감사합니다