[分享] 极狐GitLab自定义 Webhooks

Webhooks 是我们定义用来在特定触发条件下触发某种操作的 HTTP 回调机制,每个 webhook 可以配置一个或等多个触发条件,目前支持的触发事件有以下:

  • Push events
  • Tag push events
  • Comments
  • Confidential comments
  • Issues events
  • Confidential issues events
  • Merge request events
  • Job events
  • Pipeline events
  • Wiki page events
  • Deployment events
  • Feature flag events
  • Releases events

那么我们如何配置一个简单的 webhook 以实现某些功能。
本文将做个示例,示例中存在一个父项目,引用多个子模块,当子模块引用的项目更新的时候,自动更新子模块的最新提交状态到父项目。
示例项目如下:

这样就需要我们对三个子模块所引用的项目分别配置 webhook,当每个项目发生 Push events 的时候,触发 webhook 更新父项目。

网络上存在多个 webhook 的示例程序,本文引用网友分享的 golang webhook 进行配置,幸运的是我们在看不懂实现机制的同时仍然可以去使用它。

1. 配置并启动 webhook

1.1 下载并解压

dowload https://github.com/adnanh/webhook/releases/download/2.8.0/webhook-linux-amd64.tar.gz
tar -zxvf webhook-linux-amd64.tar.gz
mv webhook-linux-amd64 submodules_auto_update

1.2 创建配置文件 submodules.json

定义了 webhook 收到 gitlab 回调请求后本地要执行的脚本和脚本的工作目录。

[
  {
    "id": "submodules_auto_update",
    "execute-command": "/webhook/submodules/submodules_auto_update.sh",
    "command-working-directory": "/webhook",
  }
]

1.3 创建被调用的脚本 submodules_auto_update.sh

拉取仓库到本地,然后更新子模块,如果仓库比较大,不建议每次重新克隆仓库,建议使用git pull更新仓库状态。

#!/bin/bash

TIME=`date '+%Y-%m-%d %H:%M:%S'`
cd /root/webhook/submodules
rm -rf application-parent 2>/dev/null
git clone git@gitlab.example.cn:cicd/submodules/application-parent.git --recursive
cd application-parent
git submodule update --remote
git add .
git commit -m "update submodules at $TIME"
git push

1.4 启用 webhook

此处端口可以任意。

cd /webhook/submodules
nohup ./webhook -port 8088 -hooks ./submodules.json -verbose > webhook.log 2>&1 &

1.5 查看日志

最后一行输出即为我们要配置到 gitlab 项目的 webhook 地址http://0.0.0.0:8088/hooks/{id}
其中地址应更换为实际的地址,id 更换为前面 json 中定义的 id 名称。

[webhook] 2022/06/02 11:54:55 version 2.6.8 starting
[webhook] 2022/06/02 11:54:55 setting up os signal watcher
[webhook] 2022/06/02 11:54:55 attempting to load hooks from ./submodules.json
[webhook] 2022/06/02 11:54:55 os signal watcher ready
[webhook] 2022/06/02 11:54:55 found 1 hook(s) in file
[webhook] 2022/06/02 11:54:55 	loaded: submodules_auto_update
[webhook] 2022/06/02 11:54:55 setting up file watcher for ./submodules.json
[webhook] 2022/06/02 11:54:55 serving hooks on http://0.0.0.0:8088/hooks/{id}

2. 配置项目

2.1 配置 Application-submodule-1

转到 Project > Settings > Webhooks

2.2 测试 webhook


查看日志:

[root@gitlab submodules]# tail -f webhook.log
Submodule path 'application-submodule-1': checked out 'bbe3010f5f3487f1d671ead48d9eb5a5cf0c0313'
Submodule path 'application-submodule-2': checked out 'fdeb07589a27cabd5b33b0e56438afdd0c5a0062'
Submodule path 'application-submodule-3': checked out 'efdd71078305bfe411cacac1f949e8b3e2fb9d70'
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
Everything up-to-date

[webhook] 2022/06/02 12:37:25 [017399] finished handling submodules_auto_update

2.3 继续配置其他项目。