Chapter 09
코드가 푸시되면 자동으로 배포해 보자 - Travis CI 배포 자동화
CI & CD 소개
CI(Continuous Integration - 지속적 통합) : VCS 시스템에 PUSH가 되면 자동으로 테스트와 빌드가 수행되어 안정적인 배포 파일을 만드는 과정
CD(Continuous Deployment - 지속적인 배포) : 이 빌드 결과를 자동으로 운영서버에 무중단 배포까지 진행되는 과정
Travis CI 연동하기
- Travis CI 웹 서비스 설정
https://travis-ci.org/에서 깃허브 계정에 로그인 -> 오른쪽 위 계정명 -> Settings
->저장소 이름 찾아 상태바 활성화
- 프로젝트 설정
build.gradle과 같은 위치에서 .travis.yml 생성
cf. yml파일 확장자를 YAML(야믈)이라고 하는데 이는 쉽게 말해서 JSON에서 괄호를 제거한 것
위와 같이 작성 후, 이를 master 브랜치에 커밋 푸시
이제, 아까의 Travis CI 저장소 페이지를 확인
처음에는 아래와 같은 에러가 발생하였다.
The command "eval ./gradlew assemble " failed. Retrying, 2 of 3.
이는 아래와 같이 코드를 수정 후 해결할 수 있었다.
Travis CI와 AWS S3 연동하기
- AWS Key 발급
AWS -> IAM 검색 / 왼쪽 사이드바에서 사용자 -> 사용자 추가
기존 정책 직접 연결에서 s3full, CodeDeployFull 검색해 체크
이후 발생하는 위의 액세스 키를 Travis CI에 등록
- Travis CI에 키 등록
TravisCI의 설정 화면 ->Environment Variables 탭에서 아까의 ID, 비밀 액세스 키 등록
- S3 버킷 생성
AWS S3-> 버킷 만들기
이름은 자기가 원하는데로 설정
이제 이 S3로 배포파일을 전달해야함
- .travis.yml 추가 -> 이후, 깃허브로 푸시
Travis CI와 AWS S3, CodeDeploy 연동하기
1. EC2에 IAM 역할 추가하기
IAM 검색 -> 역할 탭에서 역할 만들기
이렇게 만든 역할을 EC2 서비스에 등록
EC2 인스턴스 -> 인스턴스 설정 -> IAM 역할 연결/바꾸기
연결까지 한 이후, 인스턴스 상태 -> 재부팅
2. CodeDeploy 에이전트 설치
EC2에 접속해 아래의 명령어 입력 (띄어쓰기 주의)
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
install 파일에 실행권한 추가,
chmod +x ./install
install 파일설치 진행
sudo ./install auto
Agent 상태 검사
sudo service codedeploy-agent status
아래와 같이 뜬다면 정상
3. CodeDeploy를 위한 권한 생성
AWS IAM -> 역할 -> 역할 만들기 -> 해당 서비스로 CodeDeploy 선택
4. CodeDeploy 생성
현재 프로젝트 중 배포 삼형제
-깃허브(코드 저장소), Travis CI(빌드용 서비스), CodeDeploy(배포 서비스)
CodeDeploy -> 애플리케이션 생성 클릭
이후, 배포 그룹 생성 클릭 -> 배포 그룹 이름과 서비스 역할 등록
5. Travis CI, S3, CodeDeploy 연동
S3에서 넘겨줄 zip 파일을 저장할 디렉토리 생성
mkdir ~/app/step2 && mkdir ~/app/step2/zip
AWS CodeDeploy의 설정은 appsepec.yml로 진행
.travis.yml에도 CodeDeploy 내용 추가
deploy의 부분에 아래 내용 추가 -> 커밋 & 푸시
Travis CI가 끝나면 CodeDeploy 화면 아래에서 배포가 수행되는 것 확인 가능
명령어로 파일들이 잘 도착했는지 확인
이제, Travis CI와 S3, CodeDeploy가 연동이 완료되었다.
배포 자동화 구성
- deploy.sh 파일 추가
scripts 디렉토리 생성 -> deploy.sh 만들기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#!/bin/bash
REPOSITORY=/home/ec2-user/app/step2
PROJECT_NAME=SpringBoot
echo "> Build 파일 복사"
cp $REPOSITORY/zip/*.jar $REPOSITORY/
echo "> 현재 구동중인 애플리케이션 pid 확인"
CURRENT_PID=$(pgrep -fl SpringBoot | 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 &
|
- .travis.yml 파일 수정
before_deploy 부분만 수정
- appspec.yml 파일 수정
기존의 코드에서 아래의 코드를 추가
모든 설정 완료 후, 커밋&푸시
travis CI에서 다음과 같이 성공메시지 확인 및 CodeDeploy에서도 배포 성공 확인
웹 브라우저에서 EC2에 도메인을 입력해서 확인해보기
이때 나는 WhiteLabel 에러가 떴는데 nohup.out의 로그를 통해 살펴본 결과, application-real-db-properties의 url를
'-'에서 '_'로 수정해 해결하였다.
- 실제 배포 과정 체험
build.gradle에서 버전 변경
version '1.0.1-SNAPSHOT'
CodeDeploy 로그 확인
AWS가 지원하는 서비스의 오류 발생시 로그 찾는 방법을 모르면 해결하기가 어렵다.
그래서 배포가 실패하면 참고하기 좋은 로그
cd /opt/codedeploy-agent/deployment-root
위의 디렉토리로 이동 후, 목록 확인(ll)
다음 장에서는 서비스 중단없는 배포방법에 대해서 배울 것이다.
'언어 > SpringBoot' 카테고리의 다른 글
[JPA] 다양한 연관관계 매핑 - 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) (0) | 2021.08.17 |
---|---|
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 10장 (0) | 2020.10.26 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 8장 (0) | 2020.10.23 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 7장 (0) | 2020.10.21 |
스프링 부트와 AWS로 혼자 구현하는 웹 서비스 6장 (0) | 2020.10.19 |