System Engineering/CI, CD

CI/CD #8. Gitlab Webhook으로 Jenkins 빌드 유발하기

ZunoXI 2021. 6. 7.

 

개요

webhook 기술을 통해 Gitlab과 Jesnkins Build 유발하기

Gitlab Webhook 

앞선 포스팅을 통해 gitlab과 jenkins를 연동하고 gitlab저장소에 있는 소스를 기반으로 Maven 빌드하는 과정을 기술했었다. 이번 포스팅은 webhook기술에 대해 알아보고 해당 기술을 통해 gitlab에서 소스 변동이 발생될 시 Jenkins에 자동으로 빌드가 되게끔 구현해본다.

 

전제조건

※ 다음중 하나라도 갖춰져있지 않을 경우, 실습과정에서 에러가 발생할 가능성이 높습니다 :(

  • gitlab 저장소(Maven 빌드 가능한 소스 권장)
  • Jenkins 서버와 (Admin 권한 권장)
  • Jenkins 환경설정 (플러그인, JDK, Git, Maven 설정)
  • Jenkins & Gitlab 연동 (Gitlaba Access Token 발행)
  • Jenkins 프로젝트 구성(Item 생성 및 설정)
  • Build now시 정상빌드여부 확인

 


 

 

 

1. Webhook 이란?

 

먼저 webhook(웹훅)이란 서버에서 어떠한 작업이 수행되었을 때 해당 작업이 수행되었음을 HTTP POST로 알리는 개념을 말한다. Webhook을 구현한 웹 애플리케이션은 특정 작업이 수행될 때 URL에 대해 POST방식으로 요청을 생성한다. 이때 url은 웹 애플리케이션을 사용하는 유저가 자신의 url을 지정할 수 있다. 관련 설명은 다음 링크를 참고

 

[가이드] Webhook

아임포트 Webhook 아임포트 Webhook을 사용함으로써 아임포트 서버에 저장된 데이터를 서버에 동기화하고 네트워크 불안정성을 보완할 수 있습니다. Webhook이란? Webhook(웹훅)이란, 서버에서 어떠한

docs.iamport.kr

 

쉽게 설명하자면 특정 애플리케이션에서 다른 애플리케이션으로 실시간 정보를 제공하는 방법이라고 할 수 있다. 필자의 환경에 설치된 gitlab서버의 경우 이미 jenkins와 연동이 되어있기에, 특정 젠킨스 item에서 build now를 클릭 시 해당시점 gitlab repo의 소스 기준으로 빌드가 되게끔 되어있다.

 

정확하지는 않지만 webhook특성을 고려해 봤을 때, gitlab에서 webhook 설정이 되어있다면 git push 시 HTTP신호를 전달받아 젠킨스에서 연동된 gitlab repo의 item에 build now를 실행하는 메커니즘이지 않을까 추론해 볼 수 있을 것 같다. (단지 추론이다..)

 

 

 

 

2. Build Trigger 설정

 

 

이번 포스팅에서 설정할 트리거는 Gitlab repo에 새로운 commit이 Push되는경우 젠킨스 Build가 자동으로 실행되게 구성할 예정이다. 설정의 전제조건은 다음과 같다. 아마도 이전 포스팅(링크)을 참고해서 item을 만들었다면 이미 구성되어 있을 것이다. 

 

기존에 생성되었던 item에 빌드유발 설정을 한다. 이때 url을 별도 메모장에 복사해 두는것이 좋다. 다음, 우측 하단에 고급 버튼을 눌러 

 

 

 

 

Secret token항목에 Generate 버튼을 누르고 표시되는 토큰 값도 별도로 복사하고 저장한다.

 

 

 

 

3. Gitlab 설정

 

 

webhook 설정

 

gitlab의 연동할 프로젝트로 이동한다음, Setting > Integrations를 클릭한 후 Go to Webhooks를 클릭한다. 

 

 

 

 

그리고 복사해뒀던 url과 token값을 입력해준다. 하단에 보면 여러가지 트리거가 유발되는 설정을 할 수 있으며 이번 경우는 Push가 되는 경우에 대한 webhook 연동으로 설정하려 한다. Push events에 공백으로 체크만 할 시 모든 branch에 대한 push에 빌드가 유발되기 때문에 master로 설정한다. 이부분은 사용자마다 본인의 상황에 고려하여 설정하는 게 좋을 것 같다.

 

 

 

 

혹시라도 위와 같은 에러가 출력되는경우는 설치형 Gitlab에서 발생하는 경우일 텐데, Gitlab의 Admin계정으로 접근하여 outbound 처리를 해줘야 한다. 관련 내용은 링크를 참고.

 

gitlab Import url is blocked: "Requests to the local network are not allowed" (#57948) · Issues · GitLab.org / GitLab FOSS

Summary When I try to import a project from a git server running in the same network domain (stash.mydomain.local) as the...

gitlab.com

조금더 간단하게 확인할 수 있는 방법에 대한 참고 포스팅 : https://mrgamza.tistory.com/808

 

Jenkins. gitlab trigger 사용하기

이전 글에 이미지 빌드를 자동으로 하여서 docker-compose up 하는거 까지 하였습니다. 그럼 오늘은 Jenkins를 gitlab에 trigger를 걸어서 push가 발생하게 되면 자동으로 빌드가 되도록 하여 보겠습니다. 이

mrgamza.tistory.com

 

 

 

Add webhook 버튼을 누른후 새로 생성된 Project Hooks에 대해 Test > Push events를 실행시킨다.

 

 

Webhook이 정상적으로 적용된경우 HTTP통신에 대해 아래와 같은 응답을 확인할 수 있다

 

빌드를 유발시켰기때문에 젠킨스에서 빌드한 내역 확인이 가능하다.

 

 

4. Jenkins 빌드 테스트

 

Shell script 수정

 

Push event를 발생시키기 앞서 기존에 빌드 후 조치에 대해 수정할 필요가 있다. Push 할 때마다 빌드를 할 때, 기존에 돌아가던 애플리케이션을 중지해야 새로운 애플리케이션이 구동할 수 있을 것이다. 따라서 본 포스팅에서는 포트번호를 기준으로 기존에 사용하던 어플리케이션을 죽이는 shell script를 구현한다. 

 

 

필자의 경우 현재구동중인 애플리케이션이 8081에서 구동되므로 8081을 사용하는 애플리케이션을 중지하고 빌드된 파일을 실행시키고자 한다. 

 

 

위와 같이 변경하면 되며 스크립트는 다음과 같다.

 

echo "Shutting down Previous Service ... "
fuser -k 8081/tcp

echo "Starting New Deploy Server ..."
export BUILD_ID=dontKillMe

nohup java -jar /var/lib/jenkins/workspace/webhook_test/target/CICDTEST-0.0.1-SNAPSHOT.jar >> nohup.out 2>&1 &

 

 

자동 빌드 테스트

 

 

저장소의 소스 중 일부를 수정한 상태에서 master로 push 이벤트를 발생시키면 jenkins가 이를 감지한다. 확인하기 쉽게 하기 위해 html에 보이는 일부를 수정하는 것을 추천한다.

 

(소스의 수정 및 add, commit, push하는 git lifecycle 일련의 과정은 생략)

 

 

 

 

 

정상적으로 빌드가 유발된 것을 확인 할 수 있다. 이제 브라우저를 통해 해당 애플리케이션이 실행되고 있는 ip:port로 접근하여 변경된 부분이 확인된다면 정상적으로 webhook 구현이 완료되었음을 확인할 수 있다.

 

 

 

다음 포스팅에서는 SSH를 이용하여 운영서버로 원격배포하는 과정을 기술할 예정 :)

반응형

댓글