需求背景:
故事上线前,需要每日下班前进行bug统计,发送到飞书群
实现效果:
通过Jenkins定时构建,统计当日新增未解决bug、当前未解决bug、待测试bug、当前bug总数,触发飞书机器人发送相关信息到项目群中,点击bug数量可跳转到jira
代码结构:
import os
import requests
from jira import JIRA
from urllib.parse import quote
class storyBugCounts:
# 故事bug统计
def __init__(self, jira_server, jira_user, jira_pwd, issue_key=os.environ['issue_key'], feishu_url=os.environ['feishu_url']):
self.jira_server=jira_server
self.jira_user=jira_user
self.jira_pwd=jira_pwd
self.jira_object=JIRA(self.jira_server,auth=(self.jira_user,self.jira_pwd)) #登录
self.issue_key = issue_key
self.feishu_url = feishu_url
def new_bugs_count(self):
"""
今日新增未解决bug统计
:return:
"""
query = f'issue in linkedIssues({self.issue_key},"is blocked by") and issuetype = 缺陷 and status in (重新打开, 待办, 开发) and created >= -12h'
all_bug = len(self.jira_object.search_issues(query))
# 对 URL 进行编码
encoded_url = quote(query)
bug_href = '{0}/issues/?filter=-4&jql={1}'.format(self.jira_server, encoded_url)
return [all_bug, bug_href]
def unsolved_bugs_count(self):
"""
未解决bug统计
:return:
"""
'''
# 通过issue获取bug数据
issue = self.jira_object.issue(self.issue_key)
unsolved_bugs = [issuelinks.id for issuelinks in issue.fields.issuelinks if issuelinks.inwardIssue.fields.status.name in ('待办','重新打开','开发')]
num_unsolved_bugs=len(unsolved_bugs)
'''
# 通过jql获取bug数据
query = f'issue in linkedIssues({self.issue_key},"is blocked by") and issuetype = 缺陷 and status in (重新打开, 待办, 开发)'
# bug数量
all_bugs = len(self.jira_object.search_issues(query))
# 对 URL 进行编码
encoded_url = quote(query)
# bug跳转链接
bug_href = '{0}/issues/?filter=-4&jql={1}'.format(self.jira_server,encoded_url)
return (all_bugs,bug_href)
def ready_to_test_bugs_count(self):
"""
待测试bug总数统计
:return:
"""
query = f'issue in linkedIssues({self.issue_key},"is blocked by") and issuetype = 缺陷 and status = 待测试'
all_bug = len(self.jira_object.search_issues(query))
# 对 URL 进行编码
encoded_url = quote(query)
bug_href = '{0}/issues/?filter=-4&jql={1}'.format(self.jira_server, encoded_url)
return [all_bug, bug_href]
def all_bugs_count(self):
"""
bug总数统计
:return:
"""
'''
# 通过issue获取bug数据
issue = self.jira_object.issue(self.issue_key)
all_bugs = [issuelinks.id for issuelinks in issue.fields.issuelinks]
num_all_bugs=len(all_bugs)
return (all_bugs,num_all_bugs)
'''
query = f'issue in linkedIssues({self.issue_key},"is blocked by") and issuetype = 缺陷'
all_bug = len(self.jira_object.search_issues(query))
# 对 URL 进行编码
encoded_url = quote(query)
bug_href = '{0}/issues/?filter=-4&jql={1}'.format(self.jira_server, encoded_url)
return [all_bug, bug_href]
def feishu_robot(self):
feishu_url = self.feishu_url
title = "{0}bug统计".format(self.issue_key)
res = requests.post(url=feishu_url,
headers={'Content-Type': 'application/json'},
json={'msg_type': "post",
'content': {"post": {"zh_cn": {
'title': title,
'content': [
[
{"tag": "text", "text": '今日新增未解决bug:'},
{"tag": "a", "href": self.new_bugs_count()[1],
"text": "{0}个".format(self.new_bugs_count()[0])}
],
[
{"tag": "text", "text": '未解决bug:'},
{"tag": "a", "href": self.unsolved_bugs_count()[1],
"text": "{0}个".format(self.unsolved_bugs_count()[0])}
],
[
{"tag": "text", "text": '待测试bug:'},
{"tag": "a", "href": self.ready_to_test_bugs_count()[1],
"text": "{0}个".format(self.ready_to_test_bugs_count()[0])}
],
[
{"tag": "text", "text": 'bug总数:'},
{"tag": "a", "href": self.all_bugs_count()[1],
"text": "{0}个".format(self.all_bugs_count()[0])}
]
]
}}}})
print(res.json())
if __name__ == '__main__':
jira_server = "https://jira.bg.xxxx"
jira_user = "xxx"
jira_pwd = "xxx"
project = "xxx"
#feishu_url = "https://open.feishu.cn/xxxx"
#issue_key = 'xxxx'
j = storyBugCounts(jira_server=jira_server, jira_user=jira_user, jira_pwd=jira_pwd, issue_key=os.environ['issue_key'],feishu_url=os.environ['feishu_url'])
n = j.new_bugs_count(), j.unsolved_bugs_count(), j.ready_to_test_bugs_count(), j.all_bugs_count(), j.feishu_robot()
for bugs in n:
print(bugs)
添加飞书机器人:
选择飞书群--设置--群机器人--添加机器人--添加自定义机器人
填写机器人名称、描述--点击添加
添加成功后,会生成一个webhook地址,要保管好此地址哦,调用飞书机器人用到的就是这个地址
飞书推送消息的内容、格式可以自己构造,具体参照:自定义机器人使用指南 - 开发指南 - 开发文档 - 飞书开放平台
Jenkins自动构建配置:
使用参数化构建+定时构建+自动拉取gitlab代码
1、新建任务
2、任务配置,添加描述
3、设置构建参数,这些参数脚本中需要引用
4、配置对应工程中的git信息
在Credentials中,点击添加-jenkins,填写jebkins凭据提供者,点击添加
5、定时构建
6、执行shell命令
7、jenkins构建
点击立即构建,构建成功,表示配置成功