本篇文章涉及技术相对简单,主要是作为日常工作中的定时任务,对禅道是否存在遗留 bug 进行统计,并在企业微信群中进行提醒。
涉及技术如下:python+requests+ 禅道 +jenkins+ 企业微信

事件起因

近期因为经常忘记录入绩效任务,所以做了一个绩效提醒的定时任务,工作日每天下午五点半群机器人在指定群发送绩效填报提醒的消息,包含当天的天气、日期、绩效系统链接等,实现效果如下:(不过不是本篇重点)

获得灵感

这两天觉得群机器人实现的功能太过单调,因此想要增加一些任务的提醒,无独有偶,在少数派网站发现了这篇文章通用状态监控通知脚本,订阅状态通知

在看完这篇文章之后,感觉可以进行实现,因为都是用的禅道,虽然版本可能存在差别,但思路都是通用的,影响比较小。

具体实现

总体实现分为以下几部分:

  1. 查看禅道:首先要确定好要请求禅道的哪个接口,因为要获取指派 bug 的数据,因此选择了/my-bug-assignedTo.html 这个接口,这个接口会返回指派给当前用户的 bug 信息,要获取的就是这部分内容:

    接口请求头中需要注意 cookie 要获取用户的 id:

  2. 获取数据:python 代码如果要实现发送请求,获取响应内容还是比较简单的,这块也没有问题

  3. 发送消息:发送消息选择了企业微信的群机器人,也可以选择其他的消息推送,比如微信可以用 server 酱

  4. 定时任务:定时任务的实现主要用了 Jenkins,最近在本地虚拟机上部署了 Jenkins,刚好用一下

至此,整体思路已经完善,可以上手编写代码了,具体代码内容如下:

mport requests
import time
from datetime import datetime
from bs4 import BeautifulSoup
import json

user_data = (
    ('zentaosid1', 'user1', 'phone_number1'),
    ('zentaosid2', 'user2', 'phone_number2')
)

# 获取禅道数据
def get_zenbug(zentaosid):
    url = "http://zentao12.demo.haogs.cn/my-bug-assignedTo.html"
    # 请求头
    headers = {
      "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
        "Cookie":f"zentaosid={zentaosid}",
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183"
    }
    response = requests.get(url,headers=headers)
    # 获取响应的html
    texthtml = response.text
    soup = BeautifulSoup(texthtml, 'html.parser')
    selected_elements = soup.select('span[class="label label-light label-badge"]')
    bugcount = selected_elements[0].text
    return bugcount

# 企业微信发送消息
def send_message(webhook_url, message, user, phone_number):
    data = {
        "msgtype": "text",
        "text": {
            "content": message,
            "mentioned_list":[f"{user}"],
            "mentioned_mobile_list":[f"{phone_number}"]
        }
    }
    response = requests.post(webhook_url, json=data)
    if response.status_code == 200:
        print("消息发送成功")
    else:
        print("消息发送失败")

if __name__ == "__main__":
    webhook_url = "webhook_url"
    # 使用循环提取数据
    for user in user_data_list:
        zentaosid = user[0]
        user = user[1]
        phone_number = user[2]
        bugcount = get_zenbug(zentaosid)
        bugcount = int(bugcount)
        print(bugcount)
        if bugcount > 0:
            message = f"禅道有未关闭bug{bugcount}个,请及时关闭"
            send_message(webhook_url, message, user, phone_number)
        else:
            print("暂无禅道bug")

本地执行成功后,把文件上传到虚拟机的指定目录:

设置文件的权限:

Jenkins 创建任务:

企业微信最终效果:

后续扩展

多人提醒

当前的多人提醒是写在代码的元组中,如果有多个人的话,可以考虑使用 excel 进行读取

丰富内容

获取到禅道 bug 的标题,提醒的时候把 bug 标题附带上,超过固定长度省略后续内容

获取到禅道 bug 的 id,把固定的 URL 和 id 拼接,提醒的时候附带链接,如下
https://zentao12.demo.haogs.cn/bug-view-bugid.html


↙↙↙阅读原文可查看相关链接,并与作者交流