Jenkins로 CI / CD를 구축할 때 A 브랜치에 변화가 있을 때에만 작업을 해야하지만 다른 브랜치의 이벤트 ( Push , Merge ) 에 대해서도 작업을 합니다. 이에 특정 브랜치에 대해서만 작업을 하고 싶을 때 해당 글을 따라 작업을 하시면 됩니다.
freestyle에선 build trigger로 GitHub hook trigger for GITScm polling
옵션을 활용했지만, 파이프라인에선 제대로 동작시키기 어렵고 디테일한 세팅은 할 수 없다는 단점이 있습니다.
해당 포스팅에서는 WebHook 이벤트 중에 특정 브랜치에 PR 이 되어 Merge 되었을 때에만 Jenkins가 동작하게 설정을 하겠습니다.
해당 내용을 구현하기 위해 Generic Webhook Trigger 라는 플러그인을 설치해 주어야합니다. 젠킨스 메인 -> Jankins 관리 -> 플러그인 관리를 통해 설치를 합니다.
파이프라인의 상세 내용에서 build trigger로 이동하면 generic webhook trigger 가 추가된 것을 볼 수 있습니다.
체크를 한 다음에 Post content parameter 를 통해 웹훅으로 데이터가 도착했을 때 해당 데이터를 분석하여 변수화하는 옵션입니다. Json 데이터를 받을 것이기에 JSONPath
를 선택하고 , Variable ( 변수명 ) , Expression ( 표현식 ) 을 입력합니다.
Expression 는 웹훅이 도착했을 때 JSON 형태의 데이터에서 파싱할 데이터를 입력합니다. 사진의
$.pull_request.merged
를 입력한것을 보면 JSON 데이터에서 pull_request 안에 merged 안에있는 데이터를 가지고 온다는 뜻입니다.
사진을 보면 PR이 Merge 되었을 때 , PR의 대상이 되는 브랜치를 가져옵니다.
토큰을 주면 토큰을 api에 쿼리 파라미터로 붙여주여야하며 그렇게 해야 웹훅 요청을 받을 수 있습니다. 이는 Job이 여러개가 있을 때 , 젠킨스 서버가 웹훅을 받았을 때 해당 토큰을 통해 어떤 파이프라인인지 구분할 수 있습니다.
위의 받아놓은 변수를 기반으로 필터링을 하는 Optional filter 항목입니다. Expression 정규식의 결과가 true 인 경우에만 빌드가 일어납니다. 사진을 보면 Text에 변수명을 넣어 주고 Expression 정규식을 넣어줬는데 해석하면 다음과 같습니다.
IF_MERGED 가 true 값이며 ( PR이 머지되었다. ) , BRANCH 가 develop ( 대상 브랜치가 develop 이다 ) 일 때 true 값을 반환합니다.
이제 레포지토리의 변화가 발생하면 WebHook을 보내줘야 하는데 이를 설정합니다.
레포지토리의 Setting -> Webhooks -> Addwebhook 을 들어갑니다.
payload에 jenkins url과 뒤에 url를 붙여 웹훅을 받을 주소를 정합니다. Content type은 json으로 설정하며 PR 과 PUSH 시에만 웹훅을 받겠다고 설정합니다.
PR를 merge 시키면 웹훅이 발생하는데 jenkins 를 보면 빌드가 실행되는것을 알 수 있습니다. 그리고 Request를 누르면 다음 응답 JSON 을 볼 수 있습니다.
jsonpath.com 에서 jsonpath 표현식을 테스트할 수 있습니다.
또한 Optional filter 는 regExr.com 페이지에서 테스트할 수 있습니다.
참고 블로그 1 : 링크