git中webhook应用

背景

要做技术项目相关的AI智能助手,但目前AI物料只能由知识库服务提供,如果存放在其他地方则无法进行训练。加上很多技术文档都在git里,为了方便迁移我们需要自动化,自动将git项目中的readme同步至知识库中便于AI训练。

于是分两步实现:

  1. 读取git中的readme实时同步到知识库;
  2. 调用知识库存储接口,将其存到知识库中;

本文主要是记录下第一步即如何读取git中的readme
目前选用webhook方式来实现,在push master分支时判断readme是否被修改,有修改就拉取readme。

步骤一:配置webhook

首先给git项目添加webhook,填写本地服务接口(注意!回调是post接口)、触发来源选择“推送事件”。


敲黑板!! 因为git服务器不在你本地所以它是无法访问到你本地服务的8001端口的!!!
这里我们需要个工具,将本地服务转发到外网,本次使用的是ngrok
注册并登录后,ngrok站点会告诉你如何使用


如果没装brew也可以选择右边Download
装好后执行下面的(8001是服务端口号),我本地服务起的8001端口所以:

ngrok http http://localhost:8001

执行之后


可以看到现在外网访问https://5f9ee832ccb7.ngrok-free.app 指向的就是我本地 http://localhost:8001
修改下刚才的配置


注意:每次重新启动ngrok,域名都会变,记得及时更改。

现在我们修改一下master上的任意文件并push或者点一下webhook里的测试按钮,选择刚才设置的推送事件

绿色部分是之前测试的记录,View details 可以查看返回,目前我们已经拿到git返回的数据了接下来进行处理。

步骤二:筛选数据

当push的分支是master且readme有修改的时候进行同步,需要在我们代码里添加这部分逻辑。
git回调传递的消息如下

{
  "object_kind": "push",
  "event_name": "push",
  "before": "ce0de62106188e6cf911ea23789193a23f4df93a",
  "after": "004c5737095bdf0ca97d894a3d866b60e8ebd6ef",
  "ref": "refs/heads/master",
  "checkout_sha": "004c5737095bdf0ca97d894a3d866b60e8ebd6ef",
  "message": null,
  "user_id": 14290,
  "user_name": "用户名",
  "user_username": "git用户",
  "user_email": "git用户邮箱",
  "user_avatar": "git用户头像",
  "project_id": 52251,
  "project": {
    "id": 52251,
    "name": "项目名",
    "description": null,
    "web_url": "项目链接",
    "avatar_url": null,
    "git_ssh_url": "git@igit.58corp.com项目.git",
    "git_http_url": "https://igit.58corp.com项目git",
    "namespace": "项目组",
    "visibility_level": 0,
    "path_with_namespace": "项目组/路径",
    "default_branch": "master",
    "ci_config_path": "",
    "homepage": "项目首页",
    "url": "url",
    "ssh_url": "ssh_url",
    "http_url": "http_url"
  },
  "commits": [
    {
      "id": "004c5737095bdf0ca97d894a3d866b60e8ebd6ef",
      "message": "Update readme.md",
      "title": "Update readme.md",
      "timestamp": "2025-08-11T08:19:57+00:00",
      "url": "https://igit.58corp.com项目/-/commit/004c5737095bdf0ca97d894a3d866b60e8ebd6ef",
      "author": {
        "name": "用户名",
        "email": "用户邮箱"
      },
      "added": [

      ],
      "modified": [
        "readme.md"
      ],
      "removed": [

      ]
    }
  ],
  "total_commits_count": 1,
  "push_options": {
  },
  "repository": {
    "name": "ele-demo",
    "url": "url",
    "description": null,
    "homepage": "homepage",
    "git_http_url": "git_http_url",
    "git_ssh_url": "git_ssh_url",
    "visibility_level": 0
  }
}

我们可以根据ref来判断是否为master分支,commit里的added和modified来判断readme是否被修改

  @Post('/branchChange')
  async branchChange(@Req() req, @Res() res) {
    const {ref, project_id, commits} = req.body;
    // master分支
    const isMaster = ref === 'refs/heads/master';
    // readme文件有修改
    let changeReadmeName = '';
    for (let commit of commits) {
      if(changeReadmeName){break}
      const curCommit = Array.from(new Set([...commit.added,...commit.modified]))
      changeReadmeName = curCommit.find(item => item.toLowerCase() === 'readme.md')
    }
    if (isMaster && changeReadmeName) {
      // 这里isMaster为是否是master分支   changeReadmeName是修改的readme的文件名
      ...
    }
  }

步骤三:申请令牌

读取git文件需要权限,本次需求需要读取多个项目所以适合使用配置个人令牌。
git--用户设置--访问令牌,选择好权限之后创建


创建完成

步骤四:读取readme

这一步就简单了,调用git接口

 // 读取readme.md内容
const fileUrl = `https://igit.58corp.com/api/v4/projects/${project_id}/repository/files/${changeReadmeName}/raw?ref=master`
const tmp = await axios.get(fileUrl, {
  headers: { 'PRIVATE-TOKEN':  “你的令牌!!!”}
})
// 这里的tmp.data就是readme里的文本啦
res.send({
  code: 200,
  data:tmp.data
})

步骤五:调用接口存储到知识库中

拿到 tmp.data 之后请求接口进行存储即可,不再赘述。
等你的接口上线后记得在webhook里把url域名改回去~

已上

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容