1. Travis CI 설정
- http://travis-ci.com 에서 깃허브로 로그인 하고 -> Settings
- 저장소 선택
- 원래 on/off하는 것이 있는데 지금은 없음
2. .travis.yml 작성
- build.gradle과 같은 위치에 작성(루트)
language: java
jdk:
- openjdk8
branches:
only:
- master
// Travis CI 서버의 Home
cache:
directories:
- '$HOME/.m2/repository'
- '$HOME/.gradle'
script: "./gradlew clean build"
before_install:
- chmod +x gradlew
// 완료 시 메일 알람
notifications:
email:
recipients:
- "메일"
3. 깃 푸시 후 Travis, 이메일 확인
4. Travix CI ,AWS S3 연동
- AWS 콘솔에서 IAM 이동
- 사용자 -> 사용자 추가
- 생성할 사용자명 입력, 프로그래밍 방식 엑세스
- s3full, codedeployf 검색하여 권한 체크
- 키:Name으로 하여 값 설정
- 모든 단계가 완료되면 엑세스 키ID, 비밀 엑세스 키 발급
- TravicCI - 프로젝트 - 설정화면으로 이동
- Environment Variables 항목에서
AWS_ACCESS_KEY, AWS_SECRET_KEY 이름으로 하여 발급된 엑세스키 입력
등록된 변수들은 .travis.tml에서 $AWS_ACCESS_KEY, $AWS_SECRET_KEY로 사용 가능
5. S3 버킷 생성
- AWS 콘솔에서 S3 이동 후 버킷 생성
- 버킷 이름 입력, 모든 퍼블릭 엑세스 차단 체크
- .travis.yml에 추가
before_deploy:
# - 현재 모든 파일을 압축
- zip -r spring-boot-project *
- mkdir -p deploy
- mv spring-boot-project.zip deploy/spring-boot-project.zip
deploy:
- provider: s3
access_key_id: $AWS_ACCESS_KEY # travis에서 설정된 변수
secret_access_key: $AWS_SECRET_KEY # travis에서 설정된 변수
bucket: spring-boot-project-build # s3 버킷 명
region: ap-northeast-2
skip_cleanup: true
acl: private # zip 접근 private
local_dir: deploy # before_deploy에서 생성한 디렉토리
wait-until-deployed: true
- 깃 푸시 후 Travic 빌드 성공, S3 업로드 성공 여부 확인
6. Travis CI, AWS S3, CodeDeploy 연동
- AWS 콘솔 -> IAM -> 역할 -> 역할 만들기
앞에서 만들었던 IAM 사용자와 역할 차이
- 역할
- AWS서비스에만 할당가능한 권한
- EC2, CodeDeploy 등
- 사용자
- AWS 서비스 외에 사용할 수 있는 권한
- 로컬PC, IDC 서버
- AWS서비스 -> EC2
- EC2RoleForA 검색 후 AmazonEC2RoleforAWSCodeDeploy체크
- 키는 Name, 값은 원하는대로 입력 후 생성 완료
- EC2 인스턴스 목록에서 인스턴스 우클릭 -> 보안 -> IAM 역할 수정
- 방금 생성한 역할 선택 후 저장
- EC2 인스턴스 재부팅
- ec2에 접속하여 다음 명령어로 CodeDeploy 설치
- sudo yum install ruby
- sudo yum install wget
- chmod +x ./install
- sudo ./install auto
- sudo service codedeploy-agent status 로 정상실행 확인
- IAM 역할 생성위해 AWS 콘솔 -> IAM -> 역할 -> 역할 만들기 -> AWS 서비스 -> CodeDeploy
- 태그로 바로 이동하여 키:Name 값: 원하는 이름 입력 후 생성
- AWS 콘솔 -> CodeDeploy 이동 후 생성
- 이름 입력, EC2/온프레미스 선택
- 배포 그룹 생성
- 생성한 서비스, 현재위치, EC2 인스턴스, 태그추가
(배포할 서비스가 2대 이상이면 블루/그린 선택)
(EC2 인스턴스 이름이 해당 이름인지 확인 이거 때문에 3시간 날림)
- 배포 구성 및 로드밸런서 해제
- EC2 서버에 S3에서 넘어올 zip를 저장할 디렉토리 생성
mkdir ~/app/step2 && mkdir ~/app/step2/zip
- appspec.yml 생성(build.gradle과 같은 위치)
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 # travis에서 설정된 변수
secret_access_key: $AWS_SECRET_KEY # travis에서 설정된 변수
bucket: spring-boot-project-build # s3 버킷 명
key: spring-boot-project.zip # 빌드파일 압축해서 전달
bundle_type: zip # 압축 확장자
application: spring-boot-project #웹 콘솔에서 등록한 codeDeploy 앱 이름
deployment_group: spring-boot-project # 웹 콘솔에서 등록한 codeDeploy 배포 그룹 이름
region: ap-northeast-2
wait-until-deployed: true
19. 푸시 - CodeDeploy 배포 여부 확인 - step2/zip 폴더에 파일 확인
7. 배포 자동화
- yml 설정파일을 /home/ec2-user/app/ 에 복사
- step2 환경에 실행될 deploy.sh 생성
- 루트 디렉토리에 scripts 디렉토리 생성 후 deploy.sh 작성
REPOSITORY=/home/ec2-user/app/step2
PROJECT_NAME=spring-boot-project
echo "> Build File Copy"
cp $REPOSITORY/zip/*.jar $REPOSITORY/
echo "> 현재 구동 중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -fl spring-boot-project(git에 등록된 플젝이름) | grep jar(찾을 수 없으면 java로 수정) | 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=/home/ec2-user/app/application-real.yml -Dspring.profiles.active=real $JAR_NAME > $REPOSITORY/nohup.out 2>&1 &
2. travis.yml 파일 before_deploy수정
before_deploy:
- mkdir -p before-deploy # zip에 포함시킬 파일들을 담을 DIR 생성
- 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/spring-boot-project.zip # deploy로 zip 파일 이동
- Travis CI는 특정파일 업로드 불가능. 항상 디렉토리 단위로 생성하여 업로드
- before-deploy는 zip파일에 포함시킬 파일들 저장
- zip -r 명령어로 before-deploy DIR 전체 압축
- appspec.yml 에 추가
permissions:
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
hooks:
ApplicationStart:
- location: deploy.sh
timeout: 60
runas: ec2-user
- CodeDeploy에서 EC2로 넘겨준 파일들을 ec2-user 권한 갖도록 함
- hooks: CodeDeploy 배포 단계에서 실행할 명령어 지정
- 푸시하여 Travis, CodeDeploy 성공여부 확인
- no Manifest 관련 에러 뜰 때
- Project Structure 에서 메인클래스 설정
- build.gradle에 다음 코드 추가
// 메인클래스 추가
manifest {
attributes 'Main-Class': 'com.example.ec2project.Ec2ProjectApplication' //메인클래스
}
- connect ECONNREFUSED 관련 에러 시
- EC2 에 있는 application-real.yml의 server address를 EC2 인스턴스 Private IP로 변경