• 质量看板开发实践(二):利用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 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())

    结果如下

    {
        '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接口时,需要传这个值

    官方接口文档:Get all boards

    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

    官方接口文档如下:Get all sprints

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

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

    # 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

  • 相关阅读:
    HTML 拖放 和 地理定位
    HTML web存储
    HTML 语义元素 和 MathML元素
    Docker Swarm
    Docker Machine
    Docker Compose
    Docker 的网络模式
    数据共享与持久化
    镜像和容器的基本操作
    Docker 简介
  • 原文地址:https://www.cnblogs.com/hanmk/p/16105130.html
Copyright © 2020-2023  润新知