본문으로 바로가기
728x90

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 [ -"$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 -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)

 

다음 장에서는 서비스 중단없는 배포방법에 대해서 배울 것이다.

728x90