前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >质量看板开发实践(二):利用python获取jira数据-进阶篇

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

作者头像
冰霜
发布2022-04-18 15:47:56
1.5K0
发布2022-04-18 15:47:56
举报

上一篇介绍了如何利用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

代码语言:javascript
复制
from jira import JIRA
import requests

jira = JIRA(server='http://jira.xxx/', basic_auth=('user', 'password'))

cookies = jira._session.cookies # 获取jira对象中的cookie
headers = {
    "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())

结果如下

代码语言:javascript
复制
{
  '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

代码语言:javascript
复制
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())

结果如下

代码语言:javascript
复制
{
  '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

代码语言:javascript
复制
# coding: utf-8
"""
author: hmk
detail: 
create_time: 
"""
from jira import JIRA
import 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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰霜blog 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、获取项目的board
  • 2、获取sprint
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档