Jenkins 연동 > 자동 폴링

Jenkins에서 Build를 수동으로 하는 작업은 공동 작업자가 많아지거나 개발 단계에서 해야할 일이 많아지면 미처 신경쓰기 힘든 경우가 많습니다.


Jenkins는 Git Repository에서 소스를 자동으로 받아 Build 작업을 자동으로 할 수 있는 방법은 2가지가 있습니다.


수동 폴링 기능과 Git Repository가 제공하는 Webhooks 기능을 사용하는 2가지 방법이 있습니다. 보통 Git Repository에 변경사항이 있는지 특정 간격으로 물어보는 것을 폴링이라고 부르며 역으로 Git Repository가 CI 서버에 변경사항을 알려주는 일을 푸시라고 부릅니다.


일반적으로 폴링의 반대말은 푸시입니다. 이 절에서는 푸시를 자동 폴링이란 단어로 사용할 것입니다. 여기에서 살펴볼 자동 폴링 기능은 GitHub, BitBucket, GitLab의 Webhooks 기능을 사용할 것입니다.


WebHooks 기능을 이용해 자동 폴링 기능을 사용하려면 먼저 Jenkins에서 Build Trigger를 설정해야 합니다. Jenkins 서버에 접속해 Build Trigger를 사용할 프로젝트 설정 페이지로 이동합니다. 그리고 나서 화면의 스크롤을 내려 “빌드 유발” 섹션을 찾습니다.


Image


“빌드 유발” 섹션을 찾았으면 “빌드를 원격으로 유발(예, 스크립트 사용)” 체크박스를 체크하면 위의 화면과 같이 나옵니다. 여기에서 빌드할 프로젝트를 식별할 유일한 키 값을 설정해줘야 합니다. 어떤 이름이든지 사용할 수 있지만 필자는 프로젝트 영문 명칭 + _token으로 사용하는 것을 권장합니다. 이렇게 하면 어떤 Git Repository에서 WebHooks 이름 관리에 일관성을 가져옵니다.


Authentication Token에 Build할 Job의 Token 이름을 지정했다면 Trigger URL을 미리 구성해둡니다. Trigger URL은 위의 화면에서 하단에 있는 나와있는 URL에서 일부분을 바꾸면 쉽게 만들 수 있습니다. 위의 화면 기준으로 본다면 샘플로 나와있는 Trigger URL은 다음과 같습니다.


1) JENKINS_URL/job/BitBucket%20%EC%97%B0%EB%8F%99/build?token=TOKEN_NAME

2) JENKINS_URL/job/BitBucket%20%EC%97%B0%EB%8F%99/buildWithParameters?token=TOKEN_NAME


위 2개의 방법 링크 중 하나를 사용할 수 있습니다. Trigger URL을 여러분의 환경에 맞게 변경해 완전한 Trigger URL을 구성할 차례입니다. 필자의 환경 기준에서 Jenkins 서버는 104.155.222.174 서버에 설치되어 있고 Token 이름으로 jiho_project를 지정했기 때문에 다음과 같은 Trigger URL을 만들 수 있습니다.


http://104.155.222.174:8080/job/BitBucket%20%EC%97%B0%EB%8F%99/build?token=jiho_project


이렇게 Trigger URL을 만들었으면 이 URL을 쉽게 사용할 수 있도록 에버노트나 찾아보기 쉬운 폴더에 텍스트 파일로 저장해둡니다. 필자의 경우는 에버노트에 저장해두었습니다.


이제 Git Repository에서 WebHooks를 설정하는 방법을 알아보겠습니다.


GitHub

먼저 WebHooks를 설정할 GitHub의 프로젝트 페이지로 이동한 다음 Settings 탭으로 이동합니다.


Image


Settings 탭으로 이동했으면 다음 화면이 나올텐데 좌측의 Webhooks & services 메뉴를 클릭합니다. 그럼 다음 화면처럼 보이게 됩니다.


Image


WebHook을 추가하기 위해 “Add webhook” 버튼을 클릭합니다. 그럼 로그인 GitHub 계정의 비밀번호를 물어봅니다.


Image


이 화면에서 로그인 중인 GitHub 계정의 비밀번호를 입력하고 “Confirm password” 버튼을 클릭합니다.


그럼 다음과 WebHook 정보를 입력할 수 있는 화면이 나옵니다.


Image


위 화면에서 Payload URL에 앞서 구성했던 Trigger URL을 입력하고 “Add webhook” 버튼을 클릭하면 WebHook 추가가 완료됩니다. 이때 WebHook이 동작할 조건을 지정할 수 있는데 기본값은 Git Repository에 Push 이벤트가 발생했을때만 동작하도록 구성되어 있습니다.


GitHub은 “Send me everything” 옵션과 “Let me select individual events” 옵션이 추가로 제공되는데 “Send me everything” 옵션이 선택되면 GitHub 프로젝트에 발생하는 모든 이벤트에 대해 WebHook를 호출하는 것이며 “Let me select individual events” 옵션을 선택하면 다음과 같은 화면이 추가 나옵니다.


Image


이 화면에서 WebHook을 호출할 이벤트 종류를 지정할 수 있습니다. 보통은 WebHook 호출 조건으로 Push만 사용하는 경우가 많기 때문에 “Let me select individual events” 옵션을 선택하는 일이 많지 않습니다.


WebHook 생성이 완료되면 화면이 바뀌면서 GitHub 프로젝트의 Webhooks & services 화면이 다음과 같이 바뀝니다.


Image


위의 화면처럼 했으면 이제 GitHub 프로젝트에 Push 이벤트가 발생하면 Jenkins가 Build를 실행하는지 살펴볼 차례입니다. GitHub Repository에 수정된 코드를 반영하고 Jenkins로 돌아왔을 때 Build가 실행되었으면 정상적으로 설정이 완료된 것입니다.


만약 여러분이 Jenkins에 GitHub 플러그인을 설치하고 사용하고 있으면 WebHooks 기능을 따로 설정하지 않더라도 Jenkins Job 구성 화면의 “빌드 유발” 섹션에서 “Build when a change is pushed to GitHub”을 체크하는 것만으로도 자동 폴링 설정(푸시)이 가능합니다.


Image


GitHub과 Jenkins의 WebHooks 기능을 이용하려면 반드시 GitHub Repository를 사용하는 Jenkins Job에 Build Trigger(유발)를 설정해야 합니다. Jenkins Job은 Git Repository로 BitBucket이나 GitLab을 지정해놨는데 GitHub Repository 가서 WebHooks를 설정하면 안되겠지요? 이 점에 유의하셔서 GitHub과 Jenkins의 WebHook 기능을 설정하면 됩니다.


BitBucket

BitBucket에 WebHook 기능을 사용하기 위해 BitBucket Repository의 설정 페이지로 이동합니다.


Image


위 화면이 나오면 좌측 메뉴에서 “Webhooks” 메뉴를 클릭합니다.


Image


이제 WebHook을 추가하기 위해 화면에서 “Add webhook” 버튼을 클릭합니다. 그럼 WebHook 정보 입력 화면이 나옵니다.


Image

BitBucket은 WebHook을 추가하기 위해 Title, WebHook URL만 입력하고 “Save” 버튼을 클릭하면 됩니다. 하지만 그 전에 Jenkins 서버가 SSL/TLS를 사용하고 있지 않으면 “Skip certificate verification” 체크박스를 체크 해지해주세요.


BitBucket에서 WebHook의 기본 호출 조건은 Repository에 푸시 이벤트가 발생했을때로 지정되어 있습니다. WebHook 추가 화면에서 Trigger 부분의 “Choose from a full list triggers”를 클릭하면 WebHook 호출 조건을 푸시 이벤트 외에도 지정할 수 있습니다.


Image


BitBukcet은 WebHook  호출조건을 Repository, Issue, Pull Request 부분에 발생하는 이벤트로 나눠 WebHook 호출조건을 지정할 수 있습니다. 위의 화면처럼 세세한 화면 지정이 필요하지 않으면 “Repository push” 체크박스 상태로 두는 것이 설정을 간소화하는데 도움이 됩니다.


이것으로 Jenkins와 BitBucket의 WebHook 설정을 완료했습니다. BitBucket Repository에 코드 변경 내용을 반영하고 Jenkins가 Build 작업을 자동으로 하는지 살펴보세요.


여러분이 Jenkins에  BitBucket 플러그인을 사용하고 있다면 WebHook을 추가하지 않아도 됩니다. 이 웹 사이트에서 “Jenkins 연동 > BitBucket 연동” 문서를 참조하세요.


BitBucket과 Jenkins의 WebHooks 기능을 이용하려면 반드시 BitBucket Repository를 사용하는 Jenkins Job에 Build Trigger(유발)를 설정해야 합니다. Jenkins Job은 Git Repository로 GitHub이나 GitLab을 지정해놨는데 GitLab Repository 가서 WebHooks를 설정하면 안되겠지요? 이 점에 유의하셔서 BitBucket과 Jenkins의 WebHook 기능을 설정하면 됩니다.


GitLab

GitLab과 Jenkins의 WebHook 기능을 사용하도록 설정하는 일은 GitHub과 BitBucket에서 하는 것만큼 매우 쉽게 할 수 있습니다. WebHook을 설정하고자 하는 프로젝트 설정 페이지로 이동해서 Webhooks 메뉴를 클릭합니다.


Image

<그림> 프로젝트 설정 페이지의 좌측 메뉴


위의 그림에서 Webhooks 메뉴를 클릭하면 다음과 같은 화면이 나옵니다.


Image


이 화면에서 Jenkins에서 구성한 WebHook의 Trigger URL을 URL칸에 입력하고 “Add Webhook” 버튼을 클릭하는 것으로 끝낼 수 있습니다. 여러분이 Jenkins 서버가 SSL를 사용하지 않는다면 반드시  “Enable SSL verification” 체크박스를 체크해제해야 Jenkins의 WebHook이 조금 더 빨리 호출될 것입니다.


Jenkins의 WebHook 호출 조건은 GitHub, BitBucket과 달리 매우 제한적인 호출 조건만을 지정할 수 있도록 되어있습니다. 많은 경우 기본 선택된 “Push events” 체크박스가 체크된 상태로 두어도 상관없습니다. 그렇다고해서 “Push events” 체크박스를 체크 해제하시면 안됩니다. GitLab은 WebHook 호출조건을 아무것도 선택하지 않아도 저장이 가능하기 때문에 유의하셔야 합니다.


이것으로 Jenkins와 GitLab의 WebHook 설정을 완료했습니다. GitLab Repository에 코드 변경 내용을 반영하고 Jenkins가 Build 작업을 자동으로 하는지 살펴보세요.


GitLab과 Jenkins의 WebHooks 기능을 이용하려면 반드시 GitLab Repository를 사용하는 Jenkins Job에 Build Trigger(유발)를 설정해야 합니다. Jenkins Job은 Git Repository로 GitHub이나 BitBucket을 지정해놨는데 BitBucket Repository 가서 WebHooks를 설정하면 안되겠지요? 이 점에 유의하셔서 GitLab과 Jenkins의 WebHook 기능을 설정하면 됩니다.


다른 서비스는…

다른 Git Repository 서비스도 WebHooks 기능을 제공하는 경우가 많습니다. 여기서는 가장 많이 사용되는 웹 기반의 도구가 지원하는 WebHooks 기능만 설명했지만 Gitorious 등도 WebHooks 기능을 지원하므로 Jenkins에 따로 접속하지 않고도 Build 작업을 하도록 하는 것이 가능합니다.


이런 작업들이 여러분의 작업 환경에 도움이 되었으면 좋겠습니다.