[CI/CD] Jenkins에서 특정 브랜치에 대한 GitHub Webhook만 처리

General Dong·2024년 11월 3일
0

CI/CD

목록 보기
3/12
post-thumbnail

GitHub Webhook의 요청값을 보면 main 브랜치를 포함한 모든 브랜치에서 push가 발생하면 Jenkins로 Webhook을 보내게 된다.
그럼 Jenkins는 Webhook을 받았으로 main 브랜치에 merge 되지 않았음에도 Build를 하게 된다.
그래서 나는 특정 브랜치에 대해서만 Jenkins가 Build를 하도록 설정하려고 한다.

나는 이전에 이미 Jenkins와 GitHub Webhook을 연결시켰기 때문에, 이번에는 특정 브랜치에 대해서만 Pipeline이 동작하도록 수정만 할 것이다. 그래서 다른 세부 사항들은 여기를 참고해주면 좋겠다!

Generic Webhook Trigger 플러그인 설치

Dashboard -> Jenkins 관리 -> Plugins -> Available plugins에서 Generic Webhook Trigger를 설치하자!

Generic Webhook Trigger 설정

적용하려는 파이프라인의 Configuration으로 들어가 Generic Webhook Trigger를 체크해준다.

체크를 하면 이렇게 세부 설정을 할 수 있게 나온다!

Post content parameters 설정

Post content parameters 아래에 추가를 클릭하고, 아래와 같이 설정해준다.

GitHub Webhook에서 보내는 JSON 요청값 중, ref의 값을 사용한다는 것이다.

Token 등록

Jenkins Pipeline과 GitHub 브랜치를 식별한 Token을 설정해준다.
해당 Token은 Webhook URL Query 파라미터에 사용되며, Jenkins Pipeline과 GitHub 브랜치를 식별하여 Jenkins 빌드를 수행한다.

Trigger로 받을 브랜치 설정

GitHub Webhook에서 보내는 JSON 요청값 중, 특정 브랜치명이 담긴 ref의 값 설정하는 것이다.

Expression에 적어줄 값은 main, develop와 같은 브랜치를 사용한다면 ^(refs/heads/브랜치명) 이렇게 작성하고,
feature/... 같은 브랜치를 사용한다면 ^(refs/heads/feature/ .+)$ 이렇게 하면된다.

Pipeline

이제 Pipeline 부분으로 내려가보자.

Repositories

Repositories에서 고급을 눌러 Refspec에 사용할 브랜치를 설정해주어야 한다.

적어줄 값은 main, develop와 같은 브랜치를 사용한다면
+refs/heads/브랜치명:refs/remotes/origin/브랜치명 이렇게 작성하고,
feature/...과 같은 브랜치를 사용한다면 +refs/heads/feature/*:refs/remotes/origin/feature/* 이렇게 하면된다.

Repository browser

Repository browser(자동)으로 선택하고, Additional Behaviours의 추가 버튼을 눌러 Advanced sub-modules behaviours를 선택해주고, 밑에 Update tracking submodules to tip of branch를 체크해준다.

이러면 sub-module도 추적하여 가져온다.

GitHub Webhook 설정

기존 GitHub Webhook의 설정을 변경하자

  • Payload URL : http://JENKINS_URL/generic-webhook-trigger/invoke?token=TOKEN_HERE
    • JENKINS_URL : jenkins의 도메인이나 IP:PORT를 적어주자.
    • TOKEN_HERE : 위에서 설정한 Token을 적어주자.
  • SSL verification : URL을 https로 사용하면 Enable로 설정해주면 된다.

테스트 해보기

설정한 브랜치 외에서 push가 이루어졌을 때

Webhook은 잘 동작하지만, Jenkins에서 설정한 브랜치와 다르다고 에러 응답값이 나온 것을 볼 수 있다.
그래서 Jenkins에서 Build가 되지 않는 것을 확인할 수 있었다.

설정한 브랜치에서 push가 이루어졌을 때

위에서 설정한 브랜치에 대해서만 Jenkins Build가 동작한다는 것을 확인할 수 있다!

소감

Jenkins와 GitHub를 처음 연결했을 때는 main 브랜치에 대해서 push가 발생했을 때만 webhook이 발생할 줄 알았다.
그러나 이후 webhook 로그를 살펴봤을 때, 다른 브랜치에서 push한 내용도 webhook으로 발생하다는 것을 알게 되어 급히 수정하게 되었다!

조금은 복잡하긴 하지만, 잘 작동하는 것을 보니 뿌듯하다!!


참고

Jenkins CI - GitHub Webhook branch 필터링 | jonghyukLee
Jenkins Generic Webhook Trigger를 이용한 GitHub branch별 push event WebHook 설정 | nineDeveloper

profile
개발에 대한 기록과 복습을 위한 블로그 | Back-end Developer

0개의 댓글