Git 저장소에서 발생하는 이벤트를 Jenkins로 전달하려면, 먼저 Git 저장소에 Webhook을 등록해 두어야 합니다.
Webhook은 push, pull_request, PR closed 등의 이벤트가 발생했을 때 미리 지정한 URL로 HTTP 요청을 보내주는 기능입니다. Jenkins에서는 이 요청을 받아 조건에 맞는 이벤트일 시 제작해둔 파이프라인을 수행합니다. 이 글에서는 Git과 Jenkins를 Webhook으로 연결하고, "특정 브랜치에 대한 PR이 merged되어 closed 되었을 때만" Jenkins 파이프라인을 트리거하는 방법을 정리해 보겠습니다.
Webhook은 Git의 이벤트인 push나 pull_request 등이 발생하면 지정된 URL로 HTTP POST 요청을 보내주는 기능입니다. 그리고 Jenkins에서는 Git이 보낸 내용을 보고 조건 검사를 거쳐 지정해둔 빌드를 실행하는 것이 Trigger(트리거)라고 합니다.
$.action : Git 저장소의 상태 변화 값입니다. $.pull_request.merged : PR이 실제로 성공했는지 확인하는 플래그 값 $.action이 발생해야 이 값으로 배포 빌드 트리거 여부를 판단합니다. $.pull_request.base.ref : PR의 대상 브랜치. 즉, merge될 곳을 나타내는 값입니다.$.ref : push 이벤트가 일어날 때 나오는 값이며, push 이벤트를 직접 트리거할 때 사용합니다.트리거에는 Webhook을 처리하는 폴링 방식과 이벤트 기반으로 나누어져 있습니다.
/github-webhook/ (토큰 불필요)merged=true 같은 분기를 설정할 수 없으며, 사용자가 push를 조심해야 하는 단점이 있습니다. /generic-webhook-trigger/invoke?token=YOUR_TOKEN$.action="closed"(PR이 닫히고) 일 때, $.pull_request.merged=true(merge가 성공적이면 실행) 같은 Webhook 요청에 대해서만 빌드할 수 있도록 처리할 수 있습니다. 본글에서는 이벤트 기반(Generic Webhook Trigger)로 진행하겠습니다.
먼저 Setting > Plugins > Available plugins 클릭하여 Generic Webhook Trigger Plugin을 검색하여 설치해줍니다.

설치하면 사진과 같이
Installed plugins에서 조회할 수 있습니다.

Trigger에서 Generic Webhook Trigger를 체크해줍니다.

만약, 해당 항목이 없다면 플러그인 설치가 제대로 안 된겁니다.
체크했다면 다음과 같은 메뉴가 나올 것인데 Post content parameters에서 +추가 버튼을 클릭하여 다음과 같이 3개의 항목을 설정해줍니다.
ACTION$.actionMERGED$.pull_request.mergedBRANCH$.pull_request.base.ref
Git Webhook 엔드포인트에 사용할 Token 값을 지정해 줍니다.
마지막으로 Optional filter에 표현식을 작성해줍니다.
(?=.*closed)(?=.*true)(?=.*develop).*branch=.develop.* : 브랜치명이 develop으로 시작하는 경우 (정규식)$ACTION $MERGED $BRANCH
배포 Repository > Settings > Webhooks > Add webhook 클릭하여 다음과 같이 작성
http://<배포서버 주소>:9090/generic-webhook-trigger/invoke?token=<Jenkins에서 작성한 토큰>Pull requests 체크 및 모든 이벤트 체크 해제테스트 방법은 간단합니다. 테스트 PR을 생성해 develop 브랜치로 merge 하세요. 그리고 Jenkins에서 빌드되는지 확인하세요. 만약 아무런 반응이 없다면 GitHub Webhook 설정했던 곳으로 들어가 Recent Deliveries를 확인해 보세요.
action, pull_request.merged, pull_request.base.ref이 작성해둔 값이 closed, true, develop인지 확인하세요.저는 빈 문자열 하나 잘못 설정해서 1시간 동안 찾았습니다...
이제 GitHub Webhook과 Jenkins Generic Webhook Trigger를 연동해 특정 브랜치(develop)로의 PR merged 시에만 정확히 파이프라인을 트리거하는 설정이 완료되었습니다. 위 내용들은 트리거 분기의 기초 작업이라 보시면 됩니다. 여기서 이제 Git의 태그를 활용하는 방식이라던가, 모니터링, 보안이 들어가면 CI/CD 파이프라인이 더욱 정교해집니다. 또한 스크립트에서도 깃 태그 방식을 이용한 Docker 이미지 태그 설정 버전 관리, Docker 서버 용량 관리 등을 신경써야 하기 때문에 한 번 설계 시 전체 워크플로우를 고려해야 합니다.