Jenkins Generic Webhook Trigger를 이용한 GitHub branch별 push event WebHook 설정
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 선택)repo
와 admin: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 Credentials 의 kind 에서 Username with password 을 선택
- Username 에 GitHub ID를 입력하고
Treat username as secret
체크박스 체크 - Password 에 GitHub 에서 발급받은 Personal access tokens 을 입력
- ID 와 Description 를 입력
- 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
값을 지정하기 위해 Variable 에 ref
를 입력
Expression 에는 $.ref
을 입력하고 JSONPath
를 선택한다
Token
Jenkins Item과 branch 를 식별할 수 있는 값을 Token 으로 입력한다
이 Token 은 GitHub 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 Type을 application/json
로 설정하지 않으면 Payload 데이터가 넘어오지 않는다
https://jenkins.home.com/generic-webhook-trigger/invoke?token=test-app-dev
2. WebHook 테스트
이제 GitHub에 Push를 해서 WebHook 이 잘 동작하는지 확인하면 된다
WebHook 이 잘 동작되고 있다면 Recent Deliveries 에서 확인할 수 있다
클릭해서 Payload 의 상세정보를 확인해볼 수 있다