GitLab + 企业微信群

595 阅读2分钟

标准的 WebHooks

  1. 网上一搜 gitlab + 企业微信群,基本都是使用 GitLab 自带的 Webhook 的来实现,简单瞄一眼,我已经会了 ↓
  2. 直接生成机器人,并把机器人链接 copy 到 Webhooks 的 URL,发送成功,完美!
    1. 但企业微信群并没有收到通知,找了好久才发现
    2. image.png
    3. image.png
    4. 这是因为 GitLab 发出的数据,并不能完美的匹配机器人需要的格式,所以必须要有另一台服务器进行接收、解析、转发才行
    5. 终于自己生成了服务,做了数据解析,并且转发到机器人,马上起飞,结果 ↓
  3. url blocked
    1. Url is blocked: Requests to the local network are not allowed
    2. 立马去找运维发邮件申请,以管理员的方式进行配置 Allow requests to the local network from hooks and services
    3. 终于开通了,再次起飞 ↓
  4. 又错啦 image.png
    1. 啥情况啊,原来虽然我们的 GitLab 是内网访问,虽然自己的服务也是内网部署的,但是出于安全考虑 GitLab 服务还是不允许直连内网服务的,
    2. 咋办?别人的东西终归不是自己的,还是自己整吧

自定义定时任务

  1. 初步设想:起一个定时任务,每 5 分钟去查询工程的 Merge Request,然后发给机器人
  2. 使用 Jenkins 的 Build periodically 或者自己部署定时服务
  3. 查找 GitLab 的 API,获取当前工程的 MR List,我们需要的信息,里面基本都有 image.png
  4. 数据请求,解析,组装,发送机器人,؏؏☝ᖗ乛◡乛ᖘ☝؏؏
    import requests
    import json
    
    # 发送到企业微信
    def sendMsgToQiYeWX(author, desc, jumpUrl, assignee):
            url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=机器人"
            headers = {
                    'Content-Type': 'application/json'
            }
            params = {
                    "msgtype": "text",
                    "text": {
                            "content": f"提交描述: {desc},\n点击查看: {jumpUrl}",
                        "mentioned_list": [assignee]
                    }
            }
            r = requests.post(url,data=json.dumps(params),headers=headers)
            return r.text
    
    
    # 请求合并待合并列表
    url = "https://gitlab.intsig.net/api/v4/projects/pid/merge_requests?state=opened"
    headers = {
        'PRIVATE-TOKEN': '自己的token'
    }
    
    response = requests.get(url, headers=headers)
    # 待合并的分支信息数组json
    response_json = response.json()
    
    # 遍历,找到每个分支合并的作者、指向合并人
    for item in response_json:
            global author, desc, jumpUrl, assignee, assigneeID
            # 开发者
            author = item['author']['name']
            # 描述
            desc = item['title']
            # 去合并页面的url
            jumpUrl = item['web_url']
            # 指向合并人
            assignee = item['assignee']['name']
            # 每个合并都发送企业微信提醒
            text = sendMsgToQiYeWX(author, desc, jumpUrl, assignee)
            print(text)
    
    
  5. 最终效果附上
  6. image.png
  7. 后续还有很多待优化的点,【未完待续】