본문으로 바로가기

해당 프로젝트는 gradle6.3과 java11로 구성되어 있습니다. 

프로젝트의 전체 소스 코드는 이곳에서 확인하실 수 있습니다.

 

f-lab-edu/shoe-auction

개인 간 신발 거래 서비스. Contribute to f-lab-edu/shoe-auction development by creating an account on GitHub.

github.com


CI/CD, Jenkins란?

 

CI/CD , Jenkins란?

CI/CD ? CI(Continuous Intergration) 란 개발자들이 빠른 주기로 작업한 내용을 통합 브랜치에 통합하고 빌드하는 개발 방식을 의미한다. 현재 진행하고 있는 프로젝트에서도 giflow 브랜치 전략을 이용해

1-7171771.tistory.com

Jenkins를 이용해 CI/CD를 구축하는 과정에서 거의 일주일넘게 밤새 고생한 경험이 있다. 이 글을 보고 조금이나마 삽질을 덜 했으면 하는 마음에 현재 진행중인 프로젝트에 CI/CD를 적용했던 과정을 포스팅하려고 한다.

 


✏️ Naver Cloud Platform

이번 프로젝트에서는 Jenkins 서버를 띄우기 위해 AWS가 아닌 NCP(네이버 클라우드 플랫폼)을 선택했다. NCP를 선택한 가장 큰 이유는 회원가입 후 결제수단 등록시 무료로 제공하는 10만 크레딧 때문이다. 또한 한글로 문서화가 아주 잘 되어있어서 처음 서버를 구축하는 경우 메뉴얼만 잘 따라하면 큰 문제없이 서버를 구축할 수 있다. 가난한 취준생에게는 무료 크레딧을 잘 활용하는 것 또한 중요하기 때문에 반드시 AWS를 사용할 필요는 없다.

 

 

 

✏️ Jenkins 서버 띄우기

먼저 네이버 클라우드 플랫폼에서 회원가입을 진행한 후 결제수단을 등록해서 10만 크레딧을 받아준다.

Jenkins 서버 구축 NCP 공식 가이드를 참고해 Jenkins 서버를 띄워준다.

참고로 NCP는 micro server를 1년간 무료로 사용할 수 있도록 지원해주고 있는데, 직접 사용해본 결과 너무 느려서 사용하는데 어려움이 있었다. (build시간이 30분이상 걸리거나, 심할경우 timeover로 build가 실패하는 경우도 있다. 웬만하면 사용하지 않는걸 추천한다)

 

사용할 서버의 스펙을 선택하는것은 본인의 자유지만 개인 토이 프로젝트에 사용할 용도라면 월34,000원[Compact] 1vCPU, 2GB Mem, 50GB Disk [g1] 서버 정도면 충분한 것 같다. NCP공식 가이드에 나와있는 statndard급 서버는 월 8만원 가량으로 무료로 지급된 10만크레딧으로 사용하기에는 조금 부담될 수 있으니 참고하도록 하자.

 

✏️Jenkins 초기 설정 - 최신 버전 업데이트

Jenkins 서버 구축 NCP 공식 가이드를 잘 따라왔다면 어렵지 않게 Jenkins 서버 구축에 성공했을 것이다. 초기 비밀번호를 입력하면 자동으로 plugIn들을 다운로드하기 시작하는데, NCP 이미지를 통해 Jenkins서버를 구축했을때 단점이 최신 버전의 Jenkins가 아닌 구 버전의 Jenkins가 설치된다는 점이다. 따라서 아래와 같이 일부 플러그인이 정상적으로 설치되지 않는다.

putty로 접속한 터미널로 가서 Jenkins의 버전을 직접 업데이트 해주자.

먼저 아래 커맨드를 입력해서 Jenkins.war의 위치를 파악하자.

ps -ef | grep jenkins

위치 파악이 끝났으면 아래 커맨드를 입력해서 Jenkins 서버를 중지시킨다.

service jenkins stop

다음으로 Jenkins.war가 저장된 위치인 /usr/lib/jenkins/jenkins.war 로 이동후 아래 커맨드를 입력해 jenkins.war 파일을 삭제한다.

rm -f jenkins.war

삭제가 완료되었으면 /usr/lib/jenkins 디렉토리에서 아래 커맨드를 입력해 최신 버전 Jenkins를 설치한다.

wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war

설치가 완료되면 service jenkins start 커맨드 입력 후 접속하면 업데이트가 완료된다.

 

✏️ Jenkins 초기설정 - JDK 버전 관리

NCP를 통해 Jenkins를 구축하면 기본적으로 JDK 1.8이 설치된다. Shoe-auction 프로젝트에서는 java11버전을 사용하고 있기 때문에 기존 JDK 삭제 후 11버전을 설치해줘야 한다. 만약 본인 프로젝트가 JDK1.8로 구성되어 있다면 이 부분은 그냥 넘어가도 좋다.

 

먼저 아래 커맨드를 입력해서 현재 설치되어있는 java 목록을 확인해보자.

rpm -qa | grep java

 

설치된 java-1.8.0을 삭제하기 위해 아래 커맨드를 입력한다.

yum remove java-1.8.0-openjdk-headless-1.8.0.262.b10-0.el7_8.x86_64

정상적으로 삭제되었으면 이어서 아래 커맨드 입력 후 java11 버전을 설치한다.

yum install java-11-openjdk-devel.x86_64

설치가 끝나면 java -version을 입력해서 설치된 jdk 버전을 확인해보자. 11버전이 정상적으로 설치되었다면 아래와 같이 출력될 것이다.

jdk11버전 설치가 완료되었다면, 이어서 환경변수 설정을 진행해야 한다. 다음 커맨드를 통해 javac의 위치를 파악한다.

readlink -f /usr/bin/javac

 

/usr/lib/jvm/java-11-openjdk-11.0.11.0.9-1.el7_9.x86_64 가 우리가 변경할 환경변수다.

 

vi 에디터를 통해 환경변수를 변경해보자

vi /etc/profile

Vi에디터를 실행한 후 맨 아래로 내리면 기존 JDK1.8로 설정되어있는 환경변수가 있을것이다. 아래와 같이 환경변수를 수정해주자.

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.11.0.9-1.el7_9.x86_64

재접속 후 echo $JAVA_HOME를 입력하면 아래와 같이 환경변수가 정상적으로 변경된 것을 볼 수 있을 것이다.

 

✏️ Jenkins 초기설정 - gradle 설치

마지막으로 CentosOS에 본인이 사용하고있는 gradle과 동일한 버전을 설치해야 한다. 아래 커맨드를 입력해 gradle을 설치한다.

wget https://services.gradle.org/distributions/gradle-6.3-bin.zip -P /tmp

다운로드가 완료되면 아래 커맨드를 입력해 /opt/gradle 디렉토리에서 방금 다운로드한 zip파일의 압축을 풀어준다.

sudo unzip -d /opt/gradle /tmp/gradle-*.zip

압축을 푼 후 ls /opt/gradle/gradle-6.3 커맨드를 입력해 정상적으로 설치되었는지 확인한다.

마지막으로 아래 커맨드를 입력해 gradle 환경변수를 설정해주면 끝!

export PATH=$PATH:/opt/gradle/gradle-6.3/bin

 


다소 귀찮은 초기 설정이 끝났다. 이제 자신의 Github와 Jenkins를 연동해서 Push 또는 PR이 발생할때마다 자동으로 Test, Build되는 과정을 함께 알아보자.

✏️ Access token 생성

Credentials 설정을 위해 자신의 깃허브에 접속해 Github > Settings > Developer settings > Personal access tokens에서 아래와 같이 체크한 후 토큰을 생성한다.

 

참고로 한번 생성된 토큰은 다시 확인할 수 없으니 다른곳에 복사해둬야한다.

토큰 생성을 끝냈으면 Jenkins 관리 -> 시스템 설정에서 GitHub 탭으로 이동한 후 Credentials을 생성해준다.

Kind에서 Secret text 선택 후 Secret에 좀 전에 발급받은 GitHub Access token을 입력한다. ID와 Description은 적절한 의미를 가지는 값을 입력하자.

 

✏️ Jenkinsfile 생성

GitHub를 통해 Push 또는 PR 이벤트가 발생하면 Jenkinsfile에 작성된 Shell script를 기준으로 Jenkins에서 다음 이벤트가 실행된다. Jenkinsfile은 프로젝트의 root 디렉토리 아래 추가해야 한다.

작성된 Jenkins 파일은 해당 포스팅의 맨 위에 첨부된 Github에서 확인할 수 있으며, 해당 프로젝트는 checkout -> test -> build -> slack으로 성공/실패 여부 전송으로 이루어진 파이프라인을 구축하고 있다.

 

 

✏️ 프로젝트 webhook 생성

Shoe-auction 프로젝트는 gitflow 브랜치 관리 전략을 사용하고 있기 때문에 모든 브랜치에 대해서 push와 PR이 일어날 때 마다 test와 build를 적용하려고 한다. 이를 위해 먼저 github webhook을 생성해야 한다.

 

해당 프로젝트 -> Settings -> Webhooks -> Add webhook 으로 이동 후 아래와 같이 webhook을 생성하자.

빨간색으로 밑줄 친 부분에는 자신의 Jenkins 주소를 입력하고, 이후 주소는 위 그림과 동일하게 입력한 후 Add webhook 버튼을 눌러 webhook을 생성한다.

 

✏️ Multibranch Pipeline 구축

마찬가지로 모든 브랜치에 대해서 push와 PR이 일어날 때 마다 test와 build를 적용해야 하기 때문에 멀티브랜치 파이프라인으로 Item을 생성해야한다.

 

Jenkins 홈에서 좌측에 새로운 Item을 클릭한 후 Multibranch Pipeline으로 Item을 생성한다.

Item 생성 후 Configure에서 Branch Sources 탭으로 이동한다.

Multibranch Pipeline는 Secret text로 Credentials 생성이 불가능하기 때문에 아래와 같이 Kind를 Username with password를 선택한 후 , Username에는 본인의 github 닉네임을 입력하고 Password에는 위에서 발급한 Access token으로 새로운 Credentials를 생성해주자.

 

Repository HTTPS URL은 자신의 프로젝트 주소를 넣어준 후 아래 Validate버튼을 눌러 정상적으로 연결이 되는지 확인해보자. 정상적으로 연결되었다면 아래와 같은 메시지가 출력될 것이다.

마지막으로 리포지토리 자동 스캔 구간을 설정해주자.

🧷 결과 확인

새로운 브랜치를 만들어 PR을 하면 자동으로 Jenkinsfile에 작성한 쉘 스크립트 기반으로 Checkout -> test -> build가 진행된다.

test와 build가 성공하면 아래와 같이 GitHub PR목록에 깨알같은 ✅ 도 확인할 수 있다.

 

 

추가적으로 Slack을 사용하고 있는 경우 간단한 설정과 쉘 스크립트 작성을 통해 다음과 같이 빌드 결과를 바로 안내받을 수 있다.