Dazzling 개발 노트

[CI/CD] 5. GitHub에서 특정 branch에 push한 경우에만 build하기 본문

DevOps/CICD

[CI/CD] 5. GitHub에서 특정 branch에 push한 경우에만 build하기

dj._.dazzling 2023. 12. 22. 22:09

 

Jenkins - GitHub - Docker 연동을 위한 기본적인 설정은 끝났다.

 

여기서 한가지 문제가 있는데 GitHub에서 Webhooks를 날릴 때,

특정 branch 가 아닌 모든 branch에 push가 일어난 경우에 webhooks가 발생된다.

 

이게 문제가 되는 이유는 필자는 main branch를 기준으로 배포하도록 설정해 두었는데,다른 개발 branch에서 push가 되는 경우, webhook이 발생되어 배포가 진행된다.근데 main 기준에서는 변경 사항이 없으니 의미없는 과정이 진행된다는 것이다.개발을 하다보면 개발 branch 간의 push가 일어나는 경우가 많기 때문에 이 문제는 반드시 조치가 필요하다.

 

GitLab에서는 해당 기능을 제공하지만, GitHub에서는 지원하지 않는 듯 하다.

 

그래서 이번 포스트에선 GitHub에서 특정 branch에서 push가 일어난 경우에만 빌드 및 배포가 진행되도록 설정하고자 한다.

해당 설정은 Jenkins에서 진행한다.

 

일단 제대로된 테스트를 위해서 개발 branch에서 push를 한 후 Jenkins Dashboard를 확인했다.

 

#34를 보면 No Changes인 것을 볼 수 있다.

원래 변경된 내용이 있으면 #32처럼 commit count가 나온다.

 

Jenkins 프로젝트 > 구성 > Build Triggers에서 Generic Webhook Trigger 옵션을 선택 후 아래와 같이 설정한다.

해당 옵션은 플러그인을 설치해야 표출되는 항목으로,

Generic Webhook Trigger 플러그인이 설치되어 있지 않다면 설치한다.

 

 

 

GitHub Webhook에서 Payload URL 설정을 바꿔준다.

 

여기서 기존에 사용하던 github-webhook/은 삭제 후 진행해야 설정이 제대로 적용된다.

 

위에는 설정 방법에 대해 요점만 언급했고,

왜 저렇게 설정해야 하는지에 대한 설명은 아래를 참고한다.

 

먼저 Webhook의 기록에서 상세 내용을 보면 다음과 같다.

 

ref 항목에서 branch의 이름을 확인할 수 있다.

우리는 이 정보를 통해서

Jenkins에서 webhook이 발생할 때, ref의 값이 refs/heads/main일 때만 hook이 발생되도록 설정한다.

 

 

이 설정을 해석하자면 Webhook으로 오는 요청의 ref값($.ref)을 branch라는 이름으로 받는다.

 

 

Optional filter에서 $branch(위에서 설정한 Variable)의 값이 Expression의 값과 동일할 때만 hook이 발생되도록 설정한다.

우리는 ref의 값이 refs/head/main일 때의 조건을 걸었으니 위와 같이 설정한다.

 

 

이 부분은 hook을 날릴 때 token 값을 이용해 요청을 구분하는 역할을 한다.

이번에는 프로젝트가 한 개라서 큰 의미는 없지만, 추후에 유용하게 사용할 수 있을 것이다.

token의 값은 원하는 값으로 입력하고

설명에 나와있는대로 ip:port의 뒷부분인 /github-webhook/ 부분을 /generic-webhook-trigger/invoke?token=toyproject 이렇게 변경한다.

 

다시 한 번 말하지만 /github-webhook/ 요청이 살아있으면 설정이 제대로 먹히지 않으니  /generic-webhook-trigger/invoke?token=toyproject를 설정한 후 기존의 webhook은 삭제한다.