Jenkins CI - GitHub Webhook branch 필터링

jonghyukLee·2022년 11월 14일
0
post-thumbnail

이번에 main 브랜치의 CI 자동화를 구축하는 과정에서 생각지 못했던 문제가 발생하여 해결 과정을 기록하고자 합니다.

현재 구성은 Git Repository에서 push 이벤트가 발생했을 때, 설정한 Jenkins 서버로 Webhook을 발생시키고, Jenkins 서버에서는 develop 브랜치를 build하는 프로젝트가 하나 존재합니다.

운영 서버도 동일하게 구성하기 위해 main 브랜치 또한 CI 자동화를 구성하려 했으나, 가만 생각해보니 이상했습니다.
main 브랜치를 빌드하는 새로운 프로젝트를 생성하더라도, Webhook 이벤트가 Jenkins의 모든 프로젝트에게 빌드를 발생시킬게 뻔했습니다.
따라서 main/dev 브랜치의 push 이벤트를 분리하여 빌드할 수 있는 방법을 찾아보았습니다.

해결 방법


GitHub Access Token 발급

GitHub에 로그인하여,
프로필 -> Settings -> Developer Settings -> Personal access tokens에서 토큰을 발급받습니다.

scope는 repo 권한과 hook 권한을 열어줍니다.

Jenkins

다음은 Jenkins입니다.
추가로 플러그인을 설치해줍니다.

Generic Webhook Trigger Plugin
GitHub Integration Plugin

(구글링을 했을 때, 다른 플러그인도 있었는데, 검색이 되지 않아 위 두개만 설치했는데, 저는 잘됐습니다..ㅋㅋ

먼저, 아까 설정한 GitHub Token을 등록해줍니다.

위 그림처럼 Credential을 추가해주고,

Kind는 Username with password를 선택합니다.
Username : GitHub ID
Password : 발급받은 Access Token
추가된 Credential을 선택해주고, 넘어갑니다.

플러그인을 정상적으로 설치 완료했다면, 프로젝트 설정에

위 이미지 처럼 Build Trigger 옵션에 Generic Webhook Trigger가 추가되있을 것입니다.

설정은 매우 간단합니다.

Generic Webhook Trigger는 Payload에 JSON 타입으로 데이터를 전송합니다.

Webhook Request를 들여다 보면 위와 같이 키값이 ref인 브랜치 정보가 Payload로 전송되고 있습니다. 따라서, 해당 변수를 활용하기 위해 입력해줍니다.


식별할 수 있는 토큰값을 입력해줍니다.


아래로 내려보면, Optional filter라는 옵션이 있습니다.
이제 위 옵션의 Expression에, refs/heads/브랜치명 형식으로 표현식을 작성해줍니다.
하단의 Text에는 위에서 정의한 변수명을 적어주면 됩니다.

Webhook 설정

마지막으로 Webhook 설정을 변경해줍니다.
앞서 사용해왔던 webhook 방식은 Github hook Trigger 이었지만, Generic Webhook Trigger로 변경합니다.

http://JenkinsURL/generic-webhook-trigger/invoke?token=토큰명
위와 같이 입력해줍니다.


벌써 설정이 끝났습니다!
push 이벤트에 대한 Webhook은 동일하게 발생하겠지만, 이제 각각의 Jenkins 프로젝트에서는 Request로 전달받은 값을 통해 branch를 확인하여 설정한 브랜치에만 Trigger가 발생하기 때문에 독립적인 빌드를 수행할 수 있습니다.

profile
머무르지 않기!

0개의 댓글