DevOps

Jenkins Generic Webhook Trigger를 이용한 GitHub branch별 push event WebHook 설정

nineDeveloper 2021. 7. 28. 13:46
728x90

GitLab 에서 WebHook 을 설정해서 사용하다가 GitHub로 이전할 일이 생겼는데
GitHub에는 branch 별로 push를 하면 branch 명으로 판단해서 WebHook 을 동작시키는 기능이 없었다

그래서 검색을 하다가 알게 된 것이 조금 복잡하긴 하지만 Generic Webhook Trigger Jenkins Plugin 을 사용하는 것이다
GitHub에서는 해당 Repository에서 Push Event 가 발생하면 등록된 WebHook URL을 Jenkins로 전송하고 Jenkins에서는
Generic Webhook Trigger에 설정된 branch에 대해서만 Jenkins Item을 수행한다

설정이 GitLab 보다 조금 복잡하긴 하지만 아래와 같이 설정하면 GitLab의 branch 별 Push Event와 동일하게 동작한다

참조:
https://plugins.jenkins.io/generic-webhook-trigger
https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EB%82%B4%EB%B6%80-Refspec
https://linux.systemv.pe.kr/tag/jenkins-%EC%84%A4%EC%A0%95/
https://github.com/gogs/gogs/issues/4105

 


 

1. Access Token 발급

1. GitHub 우측상단 아이콘을 클릭하고 Settings 을 클릭

2. 좌측 메뉴에서 Developer Settings 클릭

3. 좌측 메뉴에서 Personal access tokens 클릭

4. 우측 상단 Generate new token 클릭

5. 어떤 용도로 사용할지 Note를 작성하고 Expiration 선택 (무제한으로 하고 싶다면 No expiration 선택)
repoadmin:repo_hook 체크 박스 선택

6. Access Token 생성완료

생성된 Access Token 을 잘 기록해두고 사용하면 된다

 


 

2. Jenkins 설정

1. WebHook Jenkins 설정을 위해 Jenkins Plugin 을 설치

Generic Webhook Trigger Plugin,
GitHub Integration Plugin, GitHub plugin Jenkins Plugin 을 설치한다

2. Jenkins Item 을 생성하고 GitHub project를 설정

Project url에 Repository URL을 입력하고 Display name 에는 프로젝트 명을 입력

3. 소스 코드 관리

1. Repository URL 을 입력
2. Credentials 에서 ADD 를 클릭하고 Jenkins를 클릭

3. ADD Credentialskind 에서 Username with password 을 선택

  • Username 에 GitHub ID를 입력하고 Treat username as secret 체크박스 체크
  • Password 에 GitHub 에서 발급받은 Personal access tokens 을 입력
  • IDDescription 를 입력
  • Credentials 에서 추가한 Credential 을 선택한다

4. Refspec 에 사용할 branch 를 정의한다

▶︎ branch 별 입력 예시
feature: +refs/heads/feature/*:refs/remotes/origin/feature/*
develop: +refs/heads/develop:refs/remotes/origin/develop
release: +refs/heads/release/*:refs/remotes/origin/release/*
master: +refs/heads/master:refs/remotes/origin/master
all branch: +refs/heads/*:refs/remotes/origin/*

4. Branches to build

Branch Specifier 에 Build 할 데이터를 가져올 branch 를 설정

▶︎ branch 별 입력 예시
feature: */feature/*
develop: */develop
release: */release/*
master: */master

5. Repository browser

자동 선택

6. Additional Behaviours

Update tracking submodules to tip of branch 체크 박스를 체크

7. 빌드 유발

WebHook 을 사용하기 위해서 Generic Webhook Trigger 체크박스를 선택한다

Post content parameters

WebHook 을 통해 넘어온 데이터에서 사용할 값을 설정한다

branch 정보가 담겨있는 ref 값을 지정하기 위해 Variableref 를 입력
Expression 에는 $.ref 을 입력하고 JSONPath 를 선택한다

Token

Jenkins Item과 branch 를 식별할 수 있는 값을 Token 으로 입력한다
TokenGitHub WebHook Payload URL 의 QueryString 으로 사용되며
WebHook 의 Token 으로 Jenkins Item과 branch 를 식별해서 Jenkins Build 를 수행하게 된다

Optional filter

Expression 에 WebHook 을 Trigger 할 branch 표현식을 입력한다
Text 에는 상단에서 정의해서 추출한 ref 값을 가져오기 위해 $ref 를 입력한다

▶︎ branch 별 입력 예시
feature: ^(refs/heads/feature/.+)$
develop: ^(refs/heads/develop)
release: ^(refs/heads/release/.+)$
master: ^(refs/heads/master)
develop|feature: ^(refs/heads/develop|refs/heads/feature/.+)$

 


 

3. GitHub WebHook 설정

1. WebHook 추가

Repository -> Settings -> Webhooks -> Add webhook 클릭

Add webhook 화면에서 Payload URL 을 입력한다

Jenkins Generic Webhook Trigger 사용법에 나와있듯이
http://JENKINS_URL/generic-webhook-trigger/invoke URL을 본인 환경에 맞게 변경해서 사용하면 된다

현재 예시에서는 Token 값을 test-app-dev 로 설정 했으므로 아래와 같이 URL을 입력하고
Content Type은 반드시 application/json 로 설정한다
Content Typeapplication/json 로 설정하지 않으면 Payload 데이터가 넘어오지 않는다

https://jenkins.home.com/generic-webhook-trigger/invoke?token=test-app-dev

2. WebHook 테스트

이제 GitHub에 Push를 해서 WebHook 이 잘 동작하는지 확인하면 된다

WebHook 이 잘 동작되고 있다면 Recent Deliveries 에서 확인할 수 있다
클릭해서 Payload 의 상세정보를 확인해볼 수 있다

728x90