GitHub에 Webhook 설정
-
GitHub에 webhook 등록
-
repo에
Settings-Hooks
에서Add webhook
으로 추가-
Payload URL에
$JENKINS_BASE_URL/github-webhook/
을 입력한다.
(URL은 반드시 슬래시(/
)로 끝나야 한다)
-
-
webhook을 호출할 이벤트를 선택한다.
여기서는 remote에 push 이벤트를 받기위해
Pushes
만 선택하였다.
-
Jenkins에 pipeline 설정
-
Jenkins에 GitHub plugin 설치
-
Jenkins에 실행시킬 pipeline을 추가한다.
-
webhook을 받기 위한 repo를
General
에GitHub project-Project url
에 추가해준다. -
해당 작업를 실행시키기 위해
Build Triggers
설정을 한다.Example 1. Webhook 설정 관련 경고Project url
설정을 한 뒤에 아래와 같이 트리거 설정에 경고문이 추가되었다.아래 링크를 통해 자세한 에러 메시지를 확인할 수 있다.
There are no credentials with admin access to manage hooks on GitHubRepositoryName
위와 같은 에러 메시지가 나왔는데, 우선 webhook을 받는데는 문제 없으니 다음 스텝을 진행하였다.
-
Pipeline 스크립트 설정
NoteJenkinsfile 작성법- Declarative Pipeline
-
pipeline
: 보다 쉽게 작성 할 수 있게, 커스텀 되어 있음. Groovy-syntax기반 - Groovy 문법을 잘 몰라도 작성 가능 - Scripted Pipeline
-
node
: Groovy기반, Declarative보다 효과적으로 많은 기능을 포함하여 작성 가능. 하지만 작성 난이도가 높음 - Groovy 문법을 잘 알아야 함
void setBuildStatus(String message, String state) {
step([
$class: "GitHubCommitStatusSetter",
reposSource: [$class: "ManuallyEnteredRepositorySource", url: "https://github_url/org/your_repo"],
contextSource: [$class: "ManuallyEnteredCommitContextSource", context: "ci/jenkins/build-status"],
errorHandlers: [[$class: "ChangingBuildStatusErrorHandler", result: "UNSTABLE"]],
// 아래 값을 Display URL for Blue Ocean 플러그인 설치 후 활성화 한다.
// statusBackrefSource: [$class: "ManuallyEnteredBackrefSource", backref: "${env.RUN_DISPLAY_URL}"],
statusResultSource: [
$class: "ConditionalStatusResultSource",
results: [
[$class: "AnyBuildResult", message: message, state: state]]
]
]);
}
pipeline {
agent {
docker { image 'openjdk:11' }
}
stages {
stage('Checkout') {
steps {
git branch: 'feature/your_branch',
credentialsId: 'credentials_id',
url: 'git@github_url:org/your_repo.git'
}
}
stage('Environment') {
steps {
sh 'chmod 755 ./gradlew'
sh 'java -version'
sh 'printenv|sort'
}
}
stage('Clean') {
steps {
sh './gradlew clean'
}
}
stage('Test') {
steps {
sh './gradlew test' // unit test
}
}
stage('Build') {
steps {
sh './gradlew build -x test'
}
}
}
post {
success {
setBuildStatus("Build succeeded", "SUCCESS");
}
failure {
setBuildStatus("Build failed", "FAILURE");
}
}
}
참고할 사항
-
Build Now
버튼을 통해 한번 실행하여 webhook을 받을 수 있도록 해준다. -
checkout 받은 마지막 브랜치가 설정되고, 이 브랜치에 변경이 없으면 빌드가 실행되지 않는다.
URL 바뀌면 변경되어야 할 곳
-
GitHub > Settings > Developer settings > OAuth Apps 에서 URL 변경
-
Homepage URL
-
Authorization callback URL
-
-
GitHub > 각 repo > Settings > Hooks 에서 Webhooks 설정 변경
-
Payload URL
-
-
Jenkins > configure 에서 URL 변경
-
Jenkins Location > Jenkins URL
-
트러블슈팅
GitHub Commit Status Setter 실패
ERROR: [GitHub Commit Status Setter] ...
-
state를 설정하는 계정에 권한이 없어서 발생한 이슈.
-
Settings-Collaborators & teams
에서 계정 추가 및 Write 권한 설정
GitHub commit Status Setter 성공 응답은 받았지만 git status 안 생기는 이슈
아래와 같이 repos에 아무런 정보가 들어가지 않는 경우.
[Set GitHub commit status (universal)] SUCCESS on repos [] (sha:baf9f33) with context:ci/jenkins/build-status
Manage Jenkins > Configure System > GitHub > GitHub Servers 설정이 있어야 함
Polling has not run yet.
-
GitHub에서 Webhook이 제대로 오는가 확인
Method POST required
-
GitHub Webhook에 Service Timeout 발생
-
/github-webhook/
URL 접속하니Method POST required
에러 스택트레이스 발생 -
GitHub 플러그인 설치 필요
-
20001 포트로 되어 있었는데 Jenkins를 80 포트로 열고 GitHub에 payload url 변경하니 동작함
기타 Jenkins 설정
PR 생성시 빌드하기
기존 Github Pull Request Builder Plugin은 deprecated 되었으므로, Github Branch Source Plugin을 사용할 것
블루오션 URL 설정
-
Display URL for Blue Ocean 플러그인 설치
-
설치되면 빌드시에
RUN_DISPLAY_URL
,RUN_CHANGES_DISPLAY_URL
,JOB_DISPLAY_URL
환경변수가 추가된다. -
RUN_DISPLAY_URL
환경변수에 블루오션 빌드 결과 화면이므로 이 값을 사용한다.
-
-
setBuildStatus
안에 아래 설정 값 추가statusBackrefSource: [$class: "ManuallyEnteredBackrefSource", backref: "${env.RUN_DISPLAY_URL}"],
Jenkins GitHub 서버 설정
Note
|
Webhook을 받으려면 서버 설정 및 |
-
Jenkins에 GitHub plugin 설치
-
Jenkins 설정에서 GitHub Credentials 및 Manage hook 설정을 한다.
-
GitHub 탭안에서
고급
을 선택하면Additional action
설정이 노출된다. -
Convert login and password to token
을 선택하여 Credentials 을 추가한다. (github_url/settings/tokens 에 추가된다) -
GitHub Server에 등록하려는 서버와 Credentials을 설정한다.
-
GitHub Server
에Manage hooks
를 체크한다.
-