GoCD 파이프라인과 Webhook 알림 연동 가이드 (Feat. Discord)
안녕하세요 달소입니다.
이제 GoCD에 대한 기본적인 파이프라인 구성에 대해서 어느정도 진행해봤으니
알람도 한번 구성해보겠습니다.
다른 플러그인들도 찾아봤는데,, 사용법이 제대로 나와있지도 않고 그냥 파이프라인에서 웹훅을 호출해서 보내는게 가장 좋겠더라구요;
웹훅 경로를 노출하지않고싶으시다면 secret management를 사용하시면됩니다.
이 문서는 GoCD 파이프라인의 실행 결과를(성공 또는 실패) Discord 채널에 알림으로 보내는 방법을 안내합니다. 이 과정은 GoCD 플러그인 설치 없이 웹훅(Webhook)을 사용하여 간단하게 구현할 수 있습니다.
1단계: 💬 Discord 웹훅(Webhook) 생성하기
가장 먼저, GoCD 알림을 받을 Discord 채널에 전용 웹훅을 만들어야 합니다.
- Discord 서버 설정으로 이동 알림을 받고 싶은 서버에서 서버 이름을 클릭한 후,
서버 설정메뉴로 들어갑니다. - '연동' 메뉴 선택 왼쪽 메뉴에서
연동(또는Integrations)을 클릭합니다. - 웹훅 만들기
웹훅(또는Webhooks) 메뉴를 클릭한 후,새 웹훅버튼을 누릅니다. - 웹훅 설정 및 URL 복사
- 웹훅의 이름(예: GoCD 알림봇)과 알림을 받을 채널을 선택합니다.
- 설정이 완료되면
웹훅 URL 복사버튼을 눌러 생성된 URL을 복사합니다. - ⚠️ 중요: 이 URL은 비밀 정보이므로 외부에 노출되지 않도록 주의해야 합니다.

2단계: 🔒 웹훅 URL을 GoCD 시크릿에 저장하기
Discord 웹훅 URL은 민감한 정보이므로, SSH 키와 마찬가지로 GoCD의 시크릿 관리 기능을 통해 안전하게 저장합니다.
secrets.json파일 수정 (GoCD 서버) GoCD 서버의/godata/config/secrets.json파일에, 1단계에서 복사한 웹훅 URL을 값으로 하는 새 시크릿을 추가합니다.
/gocd-jre/bin/java -jar /godata/plugins/bundled/gocd-file-based-secrets-plugin.jar add -f /godata/config/secrets.json -n discord-webhookurl -v

그리고 웹 콘솔에서 credential management에서도 시크릿을 추가해줍니다.
이렇게 해주면 id값은 discord-webhook, 키값은 discord-webhookurl과 같은형식으로 되었습니다.

3단계: 🚀 GoCD 파이프라인에 알림 작업 추가하기
이제 파이프라인에 curl 명령어를 사용하여 Discord 웹훅으로 메시지를 보내는 작업을 추가합니다. 성공했을 때와 실패했을 때 다른 메시지를 보내도록 설정할 수 있습니다.
파이프라인 예제 (gocd.yaml)
exec에 run_if 를 두고 성고했을경우 성공관련 메시지를 웹훅으로 보내도록 구성한 yaml 입니다.
pipelines:
discord-alert:
group: defaultGroup
materials:
my-git-repo2:
git: https://github.com/dalso0418/gocd-task
branch: main
stages:
- execute-remote-command:
jobs:
run-ls-on-server:
environment_variables:
SERVER_KEY_B64: "{{SECRET:[ssh-key][gocd_deploy_key]}}"
DISCORD_WEBHOOK: "{{SECRET:[discord-webhook][discord-webhookurl]}}"
tasks:
- exec:
command: bash
arguments:
- -c
- |
mkdir -p ./temp
echo "$SERVER_KEY_B64" | base64 --decode > ./temp/id_rsa_remote
chmod 600 ./temp/id_rsa_remote
ssh -F /dev/null -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i ./temp/id_rsa_remote root@192.168.1.118 'echo "--- 원격 서버 파일 목록 ---"; ls -la'
rm -rf ./temp
- exec:
run_if: passed
command: bash
arguments:
- -c
- |
echo "{
\"embeds\": [
{
\"title\": \"✅ 파이프라인 실행 성공: ${GO_PIPELINE_NAME}\",
\"description\": \"**- Stage:** ${GO_STAGE_NAME}\\n**- Job:** ${GO_JOB_NAME}\",
\"color\": 3066993
}
]
}" > payload.json
curl -H "Content-Type: application/json" -X POST --data-binary @payload.json "$DISCORD_WEBHOOK"
on_cancel:
- exec:
command: bash
arguments:
- -c
- |
echo "{
\"embeds\": [
{
\"title\": \"❌ 파이프라인 실행 실패: ${GO_PIPELINE_NAME}\",
\"description\": \"**- Stage:** ${GO_STAGE_NAME}\\n**- Job:** ${GO_JOB_NAME}\",
\"color\": 15158332
}
]
}" > payload.json
curl -H "Content-Type: application/json" -X POST --data-binary @payload.json "$DISCORD_WEBHOOK"
기존 파이프라인의 tasks 섹션 마지막에 성공 알림 작업을 추가하고, on_cancel 블록을 이용해 실패/취소 알림을 설정합니다.

이렇게 구성하고 파이프라인이 잘 실행되면 아래처럼 디스코드로도 알람을 잘 받아볼 수 있습니다.
