[Webhook] Github Webhook을 통한 빌드/배포 자동화[2]
Github Webhook을 통한 빌드 / 배포 자동화 2편
Discord 로 알람 보내기
회사에서는 Slack을 통해 알람을 받도록 했지만, 여기서는 간단하게 디스코드를 통해 알람을 받도록 설정해보자.
- Manage Jenkins -> Plugins -> Available Plugins 에서 Discord Notifier를 검색하여 설치한다.
- Discord의 서버를 생성하고, 내부에 채널을 생성한다.
- Discord -> 채널설정 -> 연동 -> 웹후크 -> 새 웹후크 를 이용하여 웹후크 추가

아래 그림에서 웹후크 URL 복사 버튼을 이용하여 복사하고, 그 값을 Jenkins 내부에 Credentials 생성한다. 그 이후 파이프라인의 제일 하단에 post 를 추가하여 파이프라인의 스테이지들 이후 실행될 스크립트를 정의한다.
pipeline {
agent : any
stages("Webhook Test") {
... 스테이지 정의부
}
post {
success { // 성공 시 수행된다.
withCredentials([string(credentialsId: <Discord Webhook Secret ID>, variable: 'discord_url')]) {
discordSend description: "null Test description",
footer: "Success",
link: env.BUILD_URL,
title: "Test title",
result: currentBuild.currentResult,
webhookURL: "${discord_url}"
}
}
failure { // 실패 시 수행된다.
withCredentials([string(credentialsId: <Discord Webhook Secret ID>, variable: 'discord_url')]) {
discordSend description: "null Test description",
footer: "Fail",
link: env.BUILD_URL,
title: "Test title",
result: currentBuild.currentResult,
webhookURL: "${discord_url}"
}
}
}
}
정의 이후 테스트 빌드를 돌려보면 디스코드에 다음과 같이 메시지가 오는것을 확인할 수 있다.

Unit Test 결과를 Jenkins 에 표시하기
이전 글에서 ./gradlew :test test "<테스트 경로>" 를 이용하여 테스트를 수행하였다. Gradle Wrapper 는 테스트 수행 이후 "build/reports/tests/test" 경로에 테스트 결과 HTML 이 작성된다. 이 경로를 통째로 archieve 하여 Jenkins 의 HTML Publisher 플러그인을 통해 표시할 수 있다.
- Manage Jenkins -> Installed Plugins 에서 HTML Publisher 가 설치되어있는지 확인하고, 설치되지 않았다면 설치를 한다.
- 위에서 작성한 Pipeline의 post 부에 다음을 추가한다.
pipeline{
stages("stage name") {
...
}
post {
always {
try {
publishHTML (target : [allowMissing: false,
alwaysLinkToLastBuild: true,
keepAll: true,
reportDir: 'build/reports/tests/test',
reportFiles: 'index.html',
reportName: "Unit Test Result",
reportTitles: "Unit test result for ${branch}"])
} catch(e) {
echo "fail to create test result."
}
}
...
}
}
try catch 로 감싸주는 이유는 유닛 테스트 결과 자체가 생성되지 못한 에러가 발생했을 경우를 대비하기 위함이다. 웹훅을 발생시켜 파이프라인을 동작시켜보면 파이프라인의 수행 결과를 확인해보면 좌측에 Unit Test Result 탭이 생성된 것을 볼 수 있다.

테스트 결과 화면은 다음과 같이 출력된다.

현재 옵션에서는 가장 최근 결과만 보여주게 되어있지만, 옵션값을 변경하여 모든 빌드에 대한 결과를 확인할 수 있도록 설정할 수도 있다. 이때는 build/tests/test 디렉토리를 아카이빙 해야한다.
상세 내용은 아래 링크를 참조하자. HTML Publisher for jenkins
유닛 테스트 파이프라인 성공 시 브랜치 자동 병합
이 부분은 프로젝트 별로 전략에 따라 다르지만, 여기서는 다음과 같은 시나리오로 운영된다고 가정하자.
- PR이 생성되면 유닛 테스트를 실행하고, 유닛 테스트를 통과하면 base 브랜치로 병합된다.
- main 브랜치에 병합이 발생하면 unit test와 e2e test를 실행한다.
- release 가 발생하면 unit test와 e2e 테스트를 실행하고 Application을 빌드하여 배포한다.
여기서 첫번째 단계를 위해 Github API Pull Request Merge 를 참고하여 작성하자.
우선 Webhook이 보낸 Payload에서 PR의 대상 브랜치 이름(또는 commit id를 이용해도 된다.), Pull Request Number, 그리고 Repository의 계정명이 필요하다. 이전 글에서 다뤘던 Generic Webhook Trigger의 Post content 부분에 변수를 추가하자. 밑에 작성될 pipeline 부분에서는 개인 레포지토리에 사용하는 것이라 계정명이 하드코딩 되어있다.

그리고 파이프라인의 post.success 에 아래 내용을 추가한다.
pipeline {
agent any;
stages("stages name") {
...
}
post {
...
success{
...
withCredentials([string(credentialsId: 'GH_TOKEN', variable: 'GH_TOKEN')]){
sh '''curl -L \
-X PUT \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${GH_TOKEN}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/dhkim92-dev/multibranch-test/pulls/${PR_NUMBER}/merge" \ // dhkim92-dev 부분이 변수로 대체되어야 한다.
-d '{"merge_method" : "rebase"}'
'''
}
}
}
}
여기서 Authorization Header 에 Bearer 타입이 지정되어 있어 JWT를 보내야하나 싶겠지만, 이전 포스트에서 생성했었던 Github Personal Access Token을 그냥 보내면 된다. 추가로 -d 부분에는 병합 방식등을 지정할 수 있으며, 여기서는 rebase로 설정하였다.

결과는 위 사진과 같이 나온다. 정상적으로 자동 병합이 이루어진 모습이다.