Github PR시 Jenkins를 통한 빌드 자동화
Goals
1. Jenkins의 Pull Request Builder 플러그인과 Github Webhook을 이용하여 해당 Repository에 Pull Request를 하면, 자동으로 빌드가 되는 환경을 구축함
2. 빌드 실패 시 Merge
버튼이 활성화 안되도록 함
3. 설정은 아래와 같이 4단계에서 나눠서 세팅함
Step1. [Jenkins] Github Pull Request Builder 플러그인 설정
Step2. [Jenkins] Build Job 설정
Step3. [Github] Repository Webhook 설정
Step4. [Github] Branch protection rules 설정
Step1. [Jenkins] Github Pull Request Builder 플러그인 설정
Github Pull Request가 발생 시 Jenkins에 Build를 유발시키기 위해 도움을 주는 플러그인을 설치 및 설정합니다.
Jenkins 에 접속하여, 아래와 같은 경로로 Github Pull Request Builder 플러그인을 설치합니다.
Jenkins 관리 > Plugin Manager > Github Pull Request Builder 설치
정상적으로 설치가 되면 시스템 설정
으로 들어가 Pull Request Builder
를 사용할 Github의 접속정보를 설정합니다.
Tips) Credentials 는 Github Token을 발급 받아 사용합니다.
Tips) Admin list 에는 Pull Request 하는 github 계정을 설정합니다.
정상접속 시 Test basic connection to GitHub
에서 확인이 가능합니다.
아래와 같이 정상 Connection이 확인됩니다.
Connection 성공
Connection 실패
최종 설정 화면
Step2. [Jenkins] Build Job 설정
Git 연결정보
Github Event가 발생 시 Build 등 작업을 발생시킬 Repository의 Build Job을 설정합니다.
소스 코드 관리 > Git > Repositories
Repsitory URL에는 대상 Repository git URL을 입력합니다. 아래와 같이 Github Repository를 Clone하는 URL을 가져와서 입력합니다.
Tips) 그 외 정보는 아래와 같이 입력합니다.
- Credentials : Github 계정정보를 입력합니다. (Github 로그인 할때 접속 정보, 이때는 토큰방식으로 인증하지 않아도 됨)
- Refspec : +refs/pull/*:refs/remotes/origin/pr/*
- Branch Specifier : ${sha1}
최종 설정 화면
빌드 유발
GitHub Pull Request Builder
를 선택 하고 Use github hooks for build triggering
체크합니다.
Tips) Admin list 에는 Pull Request를 할 Github 계정을 지정합니다.
최종 설정 화면
Step3. [Github] Repository Webhook 설정
Github에서 발생한 Event(Pull Request, Push 등등..)를 캐치하여 Jenkins쪽으로 Webhook을 발생시키기 위한 설정입니다.
Github > 작업대상 Repository > Settings > Webhooks
여기까지 작업을 마쳤다면 아래 Webhooks 메뉴에 들어가면 자동으로 Webhook이 생긴걸 확인할 수 있습니다.
jenkins도메인/ghprbhook
경로로 생성이 됩니다.
Webhook 설정을 자세히 살펴보겠습니다. Payload URL은 jenkins의 도메인에 /ghprbhook
경로로 설정합니다.
Let me select individual events
를 선택하면, Github의 이벤트를 캐치하여 Jenkins쪽으로 Webhook을 발생시킬수 있습니다.
Pull Request
가 생길 때, Webhook을 발생시켜야 하니 Pull requests를 선택합니다.
마지막으로 Active를 체크하고 Update webhook을 클릭하면 Webhook 설정이 끝이 납니다.
아래 보이는 Recent Deliveries는 다음 챕터에서 살펴보겠습니다.
Recent Deliveries
Github -> Jenkins로 Webhook 전송이 되는지 확인해봅니다.
정상전송
정상적으로 전송이 되었을 때, 초록색 체크가 생기고 클릭 시 Response로 200응답을 받은 것을 확인할 수 있습니다.
전송실패
환경을 구성하다가 아래와 같은 에러를 마주친 적이 있습니다.
We couldn’t deliver this payload: failed to connect
네트워크 이슈로 Webhook 전송 시 Connection이 정상 되지 않았는데, 이번 케이스는 Jenkins 서버가 폐쇄망에 위치하고 있어서, 정상 Connection을 맺지 못했습니다.
방화벽 설정 후 정상 Connection이 되었습니다.
전송실패 시 확인해봐야할 사항들
- AWS EC2 사용 시, 인바운드 규칙 추가
Jenkins Location
설정
Jenkins 관리 > 시스템 설정 > Jenkins Location
PayLoad를 보낼 Jenkins URL과 동일하게 설정해줍니다.
Step4. [Github] Branch protection rules 설정
Build를 유발시키고 Build가 실패하면(Test 포함) 해당 Pull Request의 Merge 버튼 활성화가 안되도록 옵션을 설정합니다.
Github > 대상 Repository > Settings > Branches > Branch protection rules
Add rule 로 Branch protection rules을 하나 추가합니다.
Merge가 되기전 상태를 체크하여 빌드 실패 시 Require branches to be up to date before merging
을 선택하여, 브랜치가 최신 코드로 테스트 되도록 합니다.
Pull Request를 날려 빌드 확인해보기
빌드 실패
Pull Request 후 자동으로 빌드가 실행되고 해당 빌드가 실패하면, failed라고 메세지를 받습니다. Merge 버튼이 활성화가 되지 않는 것을 확인할 수 있습니다.
빌드 성공
작업이 완료된 Repository에 Pull Request를 하나 생성해봄면 아래와 같이 Build가 되고 Pending 상태로 됩니다.
정상빌드가 되면 계정 아이콘옆 주황색 점이 초록색 체크로 변경됩니다.
그 사이, Jenkins를 확인해보면 Build가 진행중인 것을 확인할 수 있습니다.