Bitbucket 저장소와 Jenkins Webhook 연동하기

Jenkins의 소스코드 관리에서 Bitbucket 저장소와 연동하여 사용할 수가 있다. 그런데, Webhook을 걸면 브랜치를 가리지 않고 항상 실행된다.

필자는 저장소에서 Webhook을 걸 때마다 개발용 앱과 상용 앱을 모두 빌드하게 하고 싶지 않았다. pull request가 개발 브랜치로 머지될 때에는 테스트 서버에 붙는 테스트용 앱을 빌드하고, 상용 브랜치로 머지될 때에는 실 서버에 붙는 상용 앱을 빌드하고 싶었다. 하지만 기본으로 제공되는 Webhook을 사용하면, 둘을 나누어 실행할 수 없었다.

Jenkins Plugin 중에 Generic Webhook Trigger를 사용하면 이러한 문제를 해결할 수 있다.

우선은 Jenkins Plugin에 Generic Webhook Trigger를 설치한다. 설치 후 설정을 희망하는 프로젝트의 환경설정으로 간 후 Build trigger에 있는 Generic Webhook Trigger를 찾는다. 체크박스를 클릭하면 파라미터 설정 창이 열린다.

Post content parameters에 다음과 같이 적었다.

Variable Name: MERGED_BRANCH
Expression: $.pullrequest.destination.branch.name
Filter: 비워놓음

Variable Name은 Shell에서 사용할 변수명을 의미한다. Expression은 해당하는 변수에 어떤 값을 저장할 것인지 결정한다. Value filter는 Expression으로 얻은 값 중에 필터하고 싶은 것을 정규식으로 표현해 주면 된다.

Bitbucket에서 Webhook을 걸 때 POST로 보내는 메시지는 세팅 후 Webhook이 걸렸을 때 나가는 내용을 확인할 수 있다.

그리고, 젠킨스 설정의 Build 메뉴로 가서 Execute shell에서 $MERGED_BRANCH 변수를 사용하여 처리하면 된다. 필자는 다음과 같이 원하는 브랜치인 경우에만 앱을 빌드하도록 설정해 놓았다.

if [ “$MERGED_BRANCH” = “release”]
  then
    bash ./gradlew clean
    bash ./gradlew assembleProd
  else
    echo “release branch is not updated!”
fi

이제 릴리즈 브랜치가 병합되었을 때에만 릴리즈 앱이 빌드된다.

이를 토대로 하면 개발 브랜치가 병합되었을 때에만 빌드되게 하는 것도 가능하다.

오늘은 요기까지.


하지만 위와 같은 방법을 사용하면, Webhook이 걸릴때 마다 Jenkins의 빌드가 실행된다. 물론 스크립트에서 조건에 따라 빌드를 하기도 하고 그렇지 않기도 한데, Jenkins의 빌드는 많이 실행되지만 실제 앱 빌드가 적은 것은 정보가 불일치하는데에서 오는 불편감이 있다.

이를 해결하기 위해서는 프록시 서버를 하나 만들어서 bypass 시키는 방법이 있다.

이에 대해서는 조만간 포스팅 할 예정이다.

Leave a Comment