Jenkins와 Bitbucket Repository를 Webhook으로 연동했을 때의 문제는 webhook 조건을 pull request merged로 설정하면 브랜치 여부에 관계없이 webhook을 날린다는 것이다. 필자가 앞서 포스팅 한 글(https://osg.kr/archives/80)에서 사용하는 방법도 마찬가지다.
안드로이드 프로젝트의 dev 브랜치가 pull request 됐을 때 개발용 앱을 빌드하고, master 브랜치에는 tag가 push 됐을 때 상용 앱을 빌드하도록 하고 싶다면? 어떻게 해야 할까? 이는 실제 필자가 서비스 개발에서 활용하고 있는 방법이다.
필자는 Proxy 서버를 Node.js로 간단히 구축하여 개발서버에서 구동하고 있다. Bitbucket에서는 webhook을 날리는 request body를 로그로 남겨준다. 로그에 기록된 body를 참조해서 해당 json을 파싱해서 활용하면 된다.
프록시 작동 원리는 다음과 같다. 개발용 앱 빌드의 경우 Bitbucket에서는 브랜치에 상관없이 pull request가 merge되면 webhook을 Node.js로 구축한 Proxy 서버에 보낸다. 프록시 서버는 body의 내용을 확인해서 dev 브랜치로 머지된 것인 경우에만 Jenkins 서버로 다시 Webhook을 걸어준다.
상용 앱 릴리즈 시에는 Bitbucket에 tag가 push되면 Proxy로 일단 webhook이 걸린다. 프록시 서버에서 body의 내용을 확인해서 master branch에 태깅됐을 경우에만 Jenkins로 webhook을 걸어준다.
단순히 도식화하면 아래와 같다.
Bitbucket Webhook > Node.js proxy > Jenkins task item
물론 Proxy 서버는 꼭 Node.js를 쓸 필요는 없다. 자신이 쓰기 편한 프레임워크를 사용하면 된다.