vlambda博客
学习文章列表

质量看板开发实践(二):利用python获取jira数据-进阶篇

上一篇介绍了如何利用python的jira库操作jira,我们能通过项目的key获取项目的相关信息,同时也能利用jql查询一些信息,例如查询bug、故事、子任务等等,但是有些属性却不能通过这种方式直接拿到


比如这样一个功能:针对某个项目,筛选不同sprint下有多少个bug


一种方式是可以写死sprint,这样前端页面也能正常选择,但这样未免太笨,而且当项目或者sprint多起来以后,也不好维护;


另一种方式是动态获取一个项目的sprint


不过python的jira库并未直接提供相关的方法来获得sprint信息


通过【网上冲浪🏄‍♀️】发现可以借助jira的REST API来获取


具体步骤如下:

(1) 先拿到项目下的board(borad是指一个项目下的面板)

(2) 通过board获取项目的sprint

1、获取项目的board

from jira import JIRAimport requests
jira = JIRA(server='http://jira.xxx/', basic_auth=('user', 'password'))
cookies = jira._session.cookies # 获取jira对象中的cookieheaders = { "Accept": "application/json",}
base_url = "http://jira.xxx.com" # jira服务的域名 board_url = base_url + "/rest/agile/1.0/board/?projectKeyOrId=project_key" # 获取board的api接口# projectKeyOrId这个字段需要填写项目的key
res = requests.get(board_url, headers=headers, cookies=cookies)print(res.json())

结果如下

{ 'maxResults': 50, 'startAt': 0, 'total': 6, 'isLast': True, 'values': [{ 'id': id1, 'self': 'http://xxx', 'name': 'xxx子任务看板', 'type': 'kanban' }, { 'id': id2, 'self': 'http://xxx', 'name': 'xxx故事看板', 'type': 'scrum' }, { 'id': id3, 'self': 'http://xxx', 'name': 'xxx缺陷看板', 'type': 'kanban' }]}

可以看到这个接口返回了这个项目下的所有面板,这里我需要故事看板对应的id(不过其实任取一个看板中的id也行,后面都能拿到sprint),后续调用获取sprint接口时,需要传这个值

官方接口文档:

https://developer.atlassian.com/cloud/jira/software/rest/api-group-other-operations/#api-rest-agile-1-0-board-get


2、获取sprint

sprint_url = base_url + "/rest/agile/1.0/board/" + str(id3) + "/sprint?state=future,active,closed"
"""这是获取sprint的api接口id3是刚才获取的board_id,state参数指定提取哪种状态sprint,它有3个值可选:future(未来),active(激活的),closed(已关闭的)""
res = requests.get(sprint_url, headers=headers, cookies=cookies)print(res.json())

结果如下

{ 'maxResults': 50, 'startAt': 0, 'isLast': True, 'values': [{ 'id': id1, 'self': 'http://jira.xxx', 'state': 'closed', 'name': '故事看板-xx项目 Sprint 0', 'startDate': '2021-08-23T13:47:00.000+08:00', 'endDate': '2021-08-30T01:47:00.000+08:00', 'completeDate': '2021-08-31T09:30:07.273+08:00', 'activatedDate': '2021-08-23T13:47:47.796+08:00', 'originBoardId': id }, { 'id': id2, 'self': 'http://jira.xxx', 'state': 'closed', 'name': 'xxx', 'startDate': '2021-08-31T10:16:00.000+08:00', 'endDate': '2021-09-14T20:16:00.000+08:00', 'completeDate': '2021-09-13T11:44:07.732+08:00', 'activatedDate': '2021-08-31T09:31:27.177+08:00', 'originBoardId': id }]}

这个接口会返回项目下的所有冲刺,其中的id就是sprint_id

官方接口文档如下

https://developer.atlassian.com/cloud/jira/software/rest/api-group-board/#api-rest-agile-1-0-board-boardid-sprint-get


综上我们就通过接口拿到了一个项目的sprint

整理下上述代码,新建文件jira_get_sprint.py

# coding: utf-8"""author: hmkdetail: create_time: """from jira import JIRAimport requests

class JiraSprint: def __init__(self): self.jira = JIRA(auth=('user', 'password'), options={'server': 'http://jira.xxx/'}) self.cookies = self.jira._session.cookies # 获取登录jira后的cookie self.base_url = "http://jira.xxx" self.headers = { "Accept": "application/json", }
def get_sprint_board(self, project): """ 获取项目的故事看板 :param project: :return: """ board_url = self.base_url + "/rest/agile/1.0/board/?projectKeyOrId="+project try: res = requests.get(board_url, headers=self.headers, cookies=self.cookies) # print(res.json()) values = res.json()["values"] # 提取返回结果中的values列表 if values: for i in values: if "故事" in i["name"]: # 取故事卡看板,如果name中包含"故事"2个字就认为这是故事看板 story_board_id = i["id"] return story_board_id # else: # continue
return values[0]["id"] # 如果不包含故事看板,则取第一个board_id
else: return None
except Exception as e: raise e
def get_sprint_id(self, project): """ 获取sprint_id :param project: :return: """ story_board_id = self.get_sprint_board(project)
if story_board_id is not None: sprint_url = self.base_url + "/rest/agile/1.0/board/" \ + str(story_board_id) \ + "/sprint?state=future,active,closed" # state = future,active,closed,表示筛选指定sprint的状态,未来、活动、关闭 try: res = requests.get(sprint_url, headers=self.headers, cookies=self.cookies) # print(res.json()) values = res.json()["values"][::-1] # 提取各个冲刺的数据,并倒序排列 if values: sprints = [{"id": sprint["id"], "name": sprint["name"], "state": sprint["state"]} for sprint in values] # print(sprints) return sprints else: print("该项目下面没有冲刺记录") return None
except Exception as e: raise e
else: print("当前没有故事看板")

if __name__ == '__main__': test = JiraSprint() # story_board_id = test.get_sprint_board("xxx") # print(story_board_id) sprint_id = test.get_sprint_id("xxx") # print(sprint_id)

参考博客:

https://blog.csdn.net/qq_19696631/article/details/116952066

https://blog.csdn.net/u013302168/article/details/121894843


质量看板开发实践(二):利用python获取jira数据-进阶篇

质量看板开发实践(二):利用python获取jira数据-进阶篇

喜欢记得来一个