Webhook 연동: git 서비스 + jenkins
최근에 git 기반의 서비스들(github, bitbucket, gitlab)은 Webhooks 기능을 기본적으로 제공합니다. Webhooks는 해당 git repository에 push, commtit, tag와 같은 이벤트가 발생하면 Jenkins와 같은 CI 서버에 이벤트를 전달하는 기능입니다. Webhooks 이벤트를 전달받은 CI서버는 해당 프로젝트의 빌드 프로세스를 시작하는 방식으로 Git 레파지토리와 CI 서버를 연동하는 방법입니다. Git 레파지토리가 호출하는 Webhooks는 HTTP URL(Restful 서비스)입니다.
Jenkins의 빌드 트리거
Webhooks 기능을 활성화 시키기 위해서 git 서비스에 Jenkins가 제공하는 URL을 등록해야 합니다. Jenkins는 Job의 설정화면의 “빌드 트리거”에서 git서비스에 등록할 URL을 만들수 있습니다.
Jenkins에 로그인하여 대상 Job을 선택한 후 아래 그림과 같이 configuration 메뉴를 클릭합니다.
Configuration 화면에서 아래 그림과 같이 상단 메뉴의 “Build Triggers”를 선택하여 “Build Triggers” 설정 부분으로 이동합니다.
“Build Triggers”영역에서는 지정한 프로젝트의 url을 확인하고 인증토큰을 설정하는 것을 제공합니다.
위 예제를 통해서 인증토큰 값과 그 아래의 안내 URL을 조합하면 다음과 같은 URL을 만들 수 있습니다.
- TOKEN_NAME: iloveminsu
- URL: JENKINS_URL/job/build%20for%20taewan.kim%20blog/build?token=TOKEN_NAME
- JENKINS_URL: http://ci.taewan.kim
최종 URL은 다음과 같습니다.
이 값을 git 서비스의 Webhooks에 등록해야 합니다.
git 서비스에 Webhook 등록
github, gitlab 그리고 Bitbucket은 유사한 형태의 Webhook 등록을 지원합니다.
github의 webhooks 등록
github에서 webhooks를 설정하기 위해서는 github 레파지토리의 settings 텝을 클릭하여 설정 페이지로 이동해야 합니다.
settings 페이지에서 “Webhooks & Services”로 부터 webhooks으로 이동가능합니다.
다음과 같이 “Add webhook” 버튼을 클릭하여 최종 Webhook 등록 폼으로 이동합니다.
등록 폼에서 앞에서 알아낸 최종 URL은 등록하고 이벤트 유형을 선택한 후 저장하면 등록이 완료됩니다.
위 예제는 push 이벤트가 발생할 때에만 앞에서 지정한 URL을 호출하는 설정입니다. push 이벤트 이외의 다른 이벤트를 지정하고자 할 경우에는 “Let me select individual events”를 선택하여 복수개의 다른 이벤트를 선택할 수 있습니다.
gitlab의 webhooks 등록
gitlab에서는 프로젝트 settings에서 다음과 같이 설정을 수행합니다. 프로젝트 메뉴에서 settings를 클릭하면 다음과 같은 설정 페이지로 이동합니다. 설정 페이지에서 “web hooks”를 선택하고 앞에서 정리한 URL과 이벤트를 선택하고 “Add Web Hook”을 클릭하여 등록합니다.
bitbucket의 webhooks 등록
bitbucket에서는 다음과 같이 프로젝트 페이지에서 settings 메뉴를 클릭하여 프로젝트 설정 페이지로 이동합니다.
프로젝트 설정 페이지에서 webhooks메뉴와 “add webhook” 버튼을 클릭하여 webhook 등록 페이지로 이동합니다.
webhook 등록페이지에서는 제목, URL, 트리거 유형을 선택한 후 “Save”버튼을 클릭하여 등록을 완료합니다.
등록이 정상적으로 완료되었다면 다음과 같이 등록된 webhook을 확인 할 수 있습니다.
Summary
이렇게 git 서비스가 제공하는 Webhooks 기능을 사용하여 CI 서버와 Git레파지토리를 효과적으로 연동할 수 있습니다. 이 기능이 없다면 CI 서버는 주기적으로 Git 레파지토리를 Polling하여 변경이 감지될 경우 빌드 프로세스를 구동하는 방식을 취해야 합니다. 이는 매우 비효율적인 체계입니다. Webhooks를 사용할 경우 세부적인 이벤트 유형 구분이 가능합니다. 이러한 방식을 통해 원하는 시점을 세부적으로 정의하여 효과적인 Git 레파지토리와 CI 서버의 연동을 구성할 수 있습니다.