DevKim

[Webtooniverse] Jenkins+webhook으로 Build&Deploy 자동화 적용 본문

Spring Project/Webtooniverse

[Webtooniverse] Jenkins+webhook으로 Build&Deploy 자동화 적용

on_doing 2021. 8. 11. 15:01
728x90

[ 현재 프로젝트 배포과정의 문제점 ]

- 팀 프로젝트 이다보니 한명이 인스턴스를 생성한 후, 기능이 수정되거니 추가될 때마다 Filezilla를 이용해서 수동으로 Build & Deploy를 수행하고 있다.

이러한 비효율적인 일을 줄이기 위해 배포 브랜치로 push가 일어나는 순간, 빌드&배포가 이루어지도록 자동화해보자.

 

실제 프로젝트에 적용하기 전, test 해본 상황을 정리해보려고한다.

 

[ 환경 ]

- Amazon Linux

- worker instance : aws ec2 t2.micro

- Jenkins instance : t2.medium

 

Ps. 이 전에 Docker+Jenkins로 실습했을 때, 프리티어 쓰겠다고 t2.micro로 어찌저찌 해보다가 빌드 몇 번하니까 Jenkins가 돌아가지를 않아서 인스턴스를 3번이나 지우고를 반복하면서.. 젠킨스 인스턴스는 무조건 2GB이상인 것을 선택해야겠다고 생각했다.

 

* swap으로 해결하려고도 해봤지만, 잠시 해소될 뿐 해결되지는 않았다.

https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-memory-swap-file/

 

스왑 파일을 사용하여 Amazon EC2 인스턴스의 스왑 공간으로 메모리 할당

1.    dd 명령을 사용하여 루트 파일 시스템에 스왑 파일을 생성합니다. 명령에서 bs는 블록 크기이고 count는 블록 수입니다. 스왑 파일의 크기는 dd 명령의 블록 크기 옵션에 블록 수 옵션을 곱

aws.amazon.com

[ Jenkins 인스턴스 ]

1. window 환경이기 때문에 gitbash를 사용하여 해당 인스턴스에 접속해주었다.

2. 필요한 것들을 쭉쭉 설치부터 해주자

 

- jdk 설치

sudo yum install -y java-1.8.0-openjdk-devel.x86_64

- jenkins 설치

위의 링크에서 jenkins 다운로드 파일을 복사하여 wget으로 설치

wget https://get.jenkins.io/war-stable/2.289.3/jenkins.war

- git 설치

sudo yum install git -y

- private key, public key 생성

ssh-keygen -t rsa

- 나중에  worker instance에 등록해주어야 할 public key,private key를 미리 확인해두자

cat id_rsa.pub
cat id_rsa

- 이제 jenkins를 시작해보자

java -jar jenkins.war

jenkins를 시작하면 please use the following password to installation 이 뜨는데, 이때 나오는 코드가 Jenkins에 접속할 때 처음에 입력해야하는 암호이다.

 

Jenkins에 접속하기 전에,

인바운드 규칙에 들어가서 8080 포트를 열어준 뒤 public주소:8080을 입력하면 Jenkins에 접속할 준비는 모두 되었다!


[ Worker 인스턴스 ]

이제 worker instance에서 필요한 것들을 설치해주고, Jenkins에서 만들어놓은 공개키(public key)를 worker에 등록해주어야 Jenkins만 worker에 ssh로 접속할 수 있게된다.

 

ssh 폴더 권한 변경

cd .ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

 

먼저,worker에도 jdk를 설치해주자

sudo yum install -y java-1.8.0-openjdk-devel.x86_64

이제 worker의 authorized keys에 Jenkins의 public key를 추가해주어야한다.

vi 편집기로 열어서 맨 아래에 Jenkins의 public key를 추가해주자

cd .ssh
ls #authorized_keys 확인
vi authorized_keys

[ Jenkins에 접속 후 ]

1. Jenkins 관리 -> 플러그인 관리 -> publish over ssh를 다운받아주자

2. 그 후 시스템 설정에 들어가준 뒤, 내리다보면 Publish over SSH가 보이는데 여기에 Jenkins의 private key를 등록해주어야한다.

 

* Key 부분에 private key를 붙어넣어도되고 아래처럼 경로를 적어줘도되는데, 개인적으로 경로를 적어놓는게 더 편해서 경로를 적어주었다.

3. worker 인스턴스 등록

- Hostname에는 private 주소를 넣어주자

* 이때 Username은 jenkins 인스턴스에서 pwd로 확인 후 넣어주어야 정상적으로 작동한다.

 

 4. 나의 경우엔, 이 전에 Gradle Wrapper를 사용해서 build를 했을 때 버전이 달라서 빌드가 안되는 이슈가 있었기 때문에 'Global Tool Configuration' 에서 해당 인텔리제이의 Gradle 버전에 맞는 Gradle을 하나 만들어주었다. 

 

5. 새로운 Item을 생성한 뒤, 구성에 들어가보자

Git에 있는 소스 코드로 관리를 할 예정이기때문에, 해당 연습용 git repo를 적어주었다.

보안을 위해 Credentials를 ssh 키로 설정해줘야하지만, 일단 연습용이기 때문에 이건 프로젝트에 도입할 때 그때 추가하도록하겠다.

 6. webhook을 위해 빌드 유발에 해당 사항을 체크해주자

7. 아까 미리 생성해 둔 Gradle 버전 선택

8. Execute shell에는 clean,build command를 작성해 주자.

chmod로 권한을 부여해주지 않으면, permission 에러가 나서 첫 번째 줄에서 권한을 열어주었다.

chmod 544 ./gradlew
./gradlew clean build

9. 빌드 후 조치에서는 빌드 후 해당 jar파일을 찾아서 배포해주는 스크립트를 적는 곳이다.

해당 인스턴스의 gitbash에서 sudo su 명령어로 shell에 접속해서 jar파일이 어디에 만들어졌는지 알아야한다.

cd와 ls -la 명령어를 반복해서 찾다가 jar파일을 발견했다. 대부분이면 아마 .jenkins 안에 build/libs 경로에 만들어질 것이다.

Exec command엔 이전에 8080포트에서 실행되던 프로세스를 종료시켜주고 빌드해주는 코드를 추가한다.


[ Github webhook ]

해당 repository에 들어가서 Webhooks에서 Jenkins의 주소를 적어주고 save 해준 뒤 초록불이 들어오면 끝이다


[ 결과 ]

push와 동시에 build&deploy가 성공적으로 이루어지는 것을 확인할 수 있고, Slack에도 알람이 가게끔 설정해둬서 더이상 Jenkins에 접속해서 일일이 성공했는지 확인하지 않아도 알람으로 받아볼 수 있게 되었다.

 

728x90
Comments