Wenzi

基于 gitlab 的 webhook 向飞书发通知

蚊子前端博客
发布于 2024/07/15 14:25
基于 gitlab 的 webhook 向飞书发通知

我们之前在文章 如何通过企业微信发送消息通知 聊过,通过流水线中的 before_script 和 after_script 执行脚本命令,来发送群机器人消息。

gitlab流水线中配置通知

但这种方式存在两个问题:

  1. 开始消息发送不及时:流水线得启动后,服务器准备好后,才能发消息;
  2. 流水线失败不发送消息:如编译时报错,会导致整个流水线停止退出;

通过 webhook 的方式就可以解决上面的痛点。

如果我们有单独的服务器来接收数据,通知方式和内容就会更灵活,还可以基于飞书的高级应用单独给某一个人发通知。

若我们没有专用的服务器,我们可以利用飞书提供的机器人指令,来搭建一个简单的服务器,然后通过 webhook 触发。再通过飞书的「群机器人」发送消息。

为什么不在 webhook 中直接通过群机器人发送消息?因为群机器人的入参是固定的,和 webhook 的消息格式对应不上。这里我们通过「机器人指令」的方式,能够把数据转换为群机器人需要的格式。同时还能配置流程状态,比如启动、成功、失败等,发送不同的消息。

1. 机器人指令的搭建 #

指令地址: https://botbuilder.feishu.cn/home

触发器的方式有多种,这里我们选择webhook触发的方式

选择触发器

有同学会问题,后面的几种 gitlab 的方式不是更好吗?这里需要在 gitlab 和飞书机器人指令中建立身份互认,但我们的 gitlab 是内网部署,无法互认,不能使用这 3 种方式。

选择webhook触发的方式后,会自动为我们创建好 URL 地址,

webhook触发

一会儿我们要把这个地址粘贴到 gitlab 的 webhook 的配置中。

输入框参数的使用,当我们通过 gitlab 的 webhook 触发了该地址,流水线的所有数据会自动传到该机器人指令中。我们可以在这里面透传一些后续流程中要用到的数据。

输入框里是 JSON 格式

假如我们需要把项目信息和用户信息透传给后续的流程:

{
  "aa": "aabbcc",
  "project": {
    "id": 345,
    "name": "test-project"
  },
  "user": {
    "id": 70,
    "name": "abc"
  }
}

如何知道 webhook 触发的参数有哪些?我们在稍后的章节中会讲到。在 gitlab 那边触发了 webhook 事件后,会产生一条记录,可以通过「查看详细信息」看到发送的所有信息。

2. 根据流水线状态触发不同的操作 #

我们的流水线有 4 种状态,我们可以给这 4 种状态发送不同的消息。

  • pending: 等待中,流水线已创建,但尚未开始执行;
  • running: 正在执行中;
  • success: 成功;
  • failure: 失败;

我们选择「条件分支」,可以给不同的操作配置不同的触发条件。

条件分支

如设定后续的操作只能在执行成功时触发,那就可以让流水线中的状态字段等于success即可。

3. 配置群机器人 #

提前在群里创建好群机器人,并获取到机器人的 webhook 地址。

点击「选择操作」,然后选择「发送 HTTP 请求」。

发送HTTP请求

然后配置上我们的群机器人:

配置群机器人

最后点击页面右上角的「启用」,这个机器人指令就可以使用了。

4. 配置 webhook #

回到我们的 gitlab,选择我们要触发流水线通知的项目,点击「设置」,选择「Webhooks」,点击「添加新的 Webhook」。

添加webhook

将我们在第 1 步中得到的触发地址填写进去,然后选择触发条件,我这里只选择了「流水线事件」。您可以按照自己的要求勾选相应的事件。点击「添加 Webhook」,即可完成配置。

点击右侧的「测试」,可以发送一条数据到机器人指令中,测试是否可以收到消息。

该 webhook 所有触发的时间均会在最近事件中展示,可以点击右侧的「查看详细信息」查看该事件发送的数据。

不同的数据,触发事件的次数和数据也是不一样的。如 push 事件只会触发一次,而流水线事件则会触发 3 次,该事件是监听的流水线的状态变更,状态流转:pending -> running -> success/failure;

5. 总结 #

这种基于 gitlab 的 webhook 触发,并通过飞书的机器人指令发送消息的方式。相对来说,配置会复杂一些,但可以解决我们之前提到的问题。

标签:gitlabwebhook
阅读(475)
Simple Empty
No data