实战 | 如何用 Python 统计 Jira 数据并可视化

Python自动化办公:用JQL查询Jira issue的5个实用场景(附完整代码) 本文介绍了利用Python和JQL查询Jira issue的五个实用自动化场景,包括每日待办摘要、Bug统计周报、Sprint进度跟踪、发布前审计和依赖关系分析。通过附带的完整代码示例,帮助开发者和项目经理从繁琐的手工操作中解放出来,实现高效办公。 阅读详情

目前公司使用 Jira 作为项目管理工具,在每一次迭代完成后的复盘会上,我们都需要针对本次迭代的 Bug 进行数据统计,以帮助管理层能更直观的了解研发的代码质量

本篇文章将介绍如何利用统计 Jira 数据,并进行可视化

1. 准备

首先,安装 Python 依赖库

# 安装依赖库
pip3 install jira
pip3 install html-table
pip3 install pyecharts
pip3 install snapshot_selenium

其中

  • jira 使用 jsql 语法从在项目中获取需要的数据
  • html-table 用于生成一个 HTML 格式的表格数据
  • pyecharts 和 snapshot_selenium 用于数据可视化

2. 实战一下

下面我们通过 7 个步骤来实现上面的功能\

2-1 登录获取客户端连接对象

from jira import JIRA

class JiraObj(object):
    def __init__(self, bug_style, project_type):
        """
        :param project_name
        :param sprint: 迭代号码
        :param bug_style: BUG状态
        """
        # Jira首页地址
        self.server = 'https://jira.**.team'

        # Jira登录账号信息
        self.basic_auth = ('用户名', '密码')

        # 创建一个客户端连接信息
        self.jiraClinet = JIRA(server=self.server, basic_auth=self.basic_auth)

2-2 根据项目类型获取看板 id

...
        # 获取boards看板
        # 所有看板信息
        boards = [(item.id, item.name) for item in self.jiraClinet.boards()]
        board_id = self.__get_board_id(boards, project_type)
        print("看板id:", board_id)
...
    def __get_board_id(self, boards, project_type):
        """
        获取看板id
        :param project_type:
        :return:
        """
        board_id = 1
        for item in boards:
            if (project_type == PROJ_TYPE.Type1 and item[1] == 't1') or (
                    project_type == PROJ_TYPE.Type2 and item[1] == 't2'):
                board_id = item[0]
                break
        return board_id
..

2-3 根据看板 id 获取迭代 id 及迭代名称

...
 # 获取项目Sprint,让用户进行选择
        sprints = self.jiraClinet.sprints(board_id=board_id)
        for item in sprints:
            if str(sprint_no) in item.name:
                self.sprint_id = item.id
                self.sprint_name = item.name
                print(f"选择Sprint,id:{self.sprint_id},name:{self.sprint_name}")
                break
...

2-4  根据项目名、Bug 类型、迭代 id 组成 jsql 语句,并查询数据

...
 def get_bug_status_jsql(self, bug_status: BUG_STATUS):
        """
        通过bug状态,获取jsql
        :param bug_status:
        :return:
        """
        status_jsql = ''
        if bug_status == BUG_STATUS.ALL:
            status_jsql = ' '
        elif bug_status == BUG_STATUS.TO_VERIFY:
            # 待验证(已解决)
            status_jsql = ' AND status = 已解决 '
        elif bug_status == BUG_STATUS.TO_FIXED:
            # 待解决(打开、重新打开、处理中)
            status_jsql = ' AND status in (打开, 重新打开, 处理中) '
        elif bug_status == BUG_STATUS.CLOSED:
            # 关闭
            status_jsql = ' AND status = Closed '
        elif bug_status == BUG_STATUS.TO_FIXED_CONTAIN_DELAY:
            # 待解决(打开、重新打开、处理中、延期处理)
            status_jsql = ' AND status in (打开, 延期处理, 重新打开, 处理中) '
        return status_jsql
...
jql = f'project = {project_name} and issuetype = 故障  {self.get_bug_status_jsql(self.bug_style)} AND Sprint = {self.sprint_id} ORDER BY priority desc, updated DESC'
        print(jql)
        lists = self.get_issue_list(jql)
...

2-5  生成本地 HTML 统计数据

需要注意的是,使用 a 标签组装的链接不能直接跳转,需要针对数据进行二次替换才能正常进行链接跳转 

from HTMLTable import (
    HTMLTable
)

...
 def gen_html_table(self, datas):
        """
        初始化表单样式
        :return:
        """
        table = HTMLTable(caption=f'实时BUG统计【{self.project_name}】,一共{len(datas)}个')

        # 表头行
        table.append_header_rows((('ID', '状态', '优先级', '责任人', '终端', 'URL'),))

        # 添加数据
        table.append_data_rows(datas)

        # 设置样式
        table.caption.set_style({'font-size': '15px'})

        # 其他样式设置
        ...

        # 替换数据,便于展示href地址
        html = table.to_html().replace("&lt;", "<").replace("&gt;", ">").replace("&quot;", '"')

        with open(f"./output/{self.project_name}-bug_{current_time()}.html", 'w', encoding='utf-8') as file:
            file.write(html)
...
# 生成本地文件的数据
output_tuples = tuple([
            (item.get("key"), item.get("status"), item.get("priority"), item.get('duty'), item.get('end_type'),
             f'<a href="{item.get("url")}" target="_blank">点我查看</a>') for item in lists])

# 生成本地HTML文件
self.gen_html_table(output_tuples)
..

2-6 数据统计

首先,这里按 Bug 责任人进行分组,然后按数目进行降序排列

然后,按 Bug 优先等级进行降序排列

最后,获取每一个端的 Bug 总数\

...
        # 2、统计每个人(按数目)
        datas_by_count = {}
        for item in lists:
            datas_by_count[item.get("duty")] = datas_by_count.get(item.get("duty"), 0) + 1

        # 降序排序
        datas_by_count = sorted(datas_by_count.items(), key=lambda item: item[1], reverse=True)

        # print("按Bug总数排序:", datas_by_count)

        # 3、统计每个人(按优先级)
        datas_by_priority = {}

        for item in datas_by_count:
            # 责任人
            name = item[0]
            # 5个优先级对应的数目
            counts = self.get_assignee_count(lists, name)
            datas_by_priority[name] = counts

        # 排序(按优先级多条件降序排列)
        datas_by_priority = sorted(datas_by_priority.items(),
                                   key=lambda item: (item[1][0], item[1][1], item[1][2], item[1][3]), reverse=True)

        # print("按Bug优先级排序:", datas_by_priority)

        # 4、根据终端进行统计分类
        keys, values = self.get_end_type_count(lists)
...

2-7 可视化

针对上面的 3 组数据,使用 pyecharts 绘制成柱状图和饼状图\

...
      def draw_image(self, datas_by_count, datas_by_priority, keys, values):
        """
        绘制图片
        :param values:
        :param keys:
        :param datas_by_count: 按bug总数排序结果
        :param datas_by_priority: 按bug优先级排序结果
        :return:
        """
        # 1、按BUG总数排序绘制
        bar = (
            Bar().set_global_opts(
                title_opts=opts.TitleOpts(title=f"{self.project_name}", subtitle=f"{self.sprint_name}")))
        bar.add_xaxis([item[0] for item in datas_by_count])
        bar.add_yaxis(f"BUG总数", [item[1] for item in datas_by_count])

        # render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
        # 也可以传入路径参数,如 bar.render("mycharts.html")
        # bar.render(path=f'{sprint_name}-BUG总数.html')
        make_snapshot(snapshot, bar.render(), "./output/1.png")

        # 2、按优先级排序绘制
        bar2 = (
            # Bar(init_opts=opts.InitOpts(theme=ThemeType.INFOGRAPHIC))
            Bar()
                .add_xaxis([item[0] for item in datas_by_priority])
                .add_yaxis(self.__get_priority(BUG_PRIORITY.Highest), [item[1][0] for item in datas_by_priority],
                           color='#6aa84f')
                .add_yaxis(self.__get_priority(BUG_PRIORITY.High), [item[1][1] for item in datas_by_priority],
                           color='#a2c4c9')
                .add_yaxis(self.__get_priority(BUG_PRIORITY.Medium), [item[1][2] for item in datas_by_priority],
                           color="#ff9900")
                .add_yaxis(self.__get_priority(BUG_PRIORITY.Low), [item[1][3] for item in datas_by_priority],
                           color="#ea9999")
                .add_yaxis(self.__get_priority(BUG_PRIORITY.Lowest), [item[1][4] for item in datas_by_priority],
                           color="#980000")
                .set_global_opts(
                title_opts=opts.TitleOpts(title=f"{self.project_name}", subtitle=f"{self.sprint_name}"))
        )
        # bar2.render(path=f'{sprint_name}-BUG优先级.html')
        make_snapshot(snapshot, bar2.render(), "./output/2.png")

        # 3、根据终端来绘制饼图
        if len(keys) > 0 and len(values) > 0:
            c = (
                Pie()
                    .add("", [list(z) for z in zip(keys, values)])
                    .set_global_opts(title_opts=opts.TitleOpts(title="各端BUG分布"))
                    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
            )
            make_snapshot(snapshot, c.render(), f"./output/{self.project_name}_end.png")

        # 4、合并两张图片
        self.concatenate_img(['./output/1.png', './output/2.png'], img_name=f'./output/{self.sprint_name}_bug.png',
                             axis=1)
...

3. 总结

通过上面的操作,每次只需要输入项目类型、迭代版本号、要统计的 Bug 类型,就能统计出所需要的数据并绘制成图表。

以上就是本次分享的所有内容,如果你觉得文章还不错,欢迎关注公众号:Python编程学习圈,每日干货分享,发送“J”还可领取大量学习资料,内容覆盖Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是前往编程学习网,了解更多编程技术知识。

Python库 | pytest-jira-0.3.8.zip 资源分类:Python库 所属语言:Python 资源全名:pytest-jira-0.3.8.zip 资源来源:官方 安装方法:https://lanzao.blog.youkuaiyun.com/article/details/101784059 立即下载

相关推荐

fMRI脑影像特征提取——Pearson相关与低阶功能连接LOFC(dpabi+nilearn)

一个连接由节点和连接强度(边)组成。功能连接中的节点可以是单个体素,也可以是由脑图谱定义的脑区ROI。通常的做法是将脑图谱中多个或者全部ROI作为节点,或者是将脑图谱中单个ROI与全脑体素作为节点。定义连接强度(边),最常用的方式是Pearson相关,两个节点之间可能没有物理连接,但如果他们的BOLD信号同步性很强,则它们之间可能存在很强的功能上的协作,即很强的功能连接,这是一个很好的表征两个节点间关系的特征。

意疏的学习笔记 2万+

使用 JIRA API 获取 Issue

普通模式使用 Python 登录 Jira : import urllib2 import urllib def loginJira(): ''' if environment is required proxy = {'http':'xxxproxy:xxxxx'} proxy_support = urllib2.ProxyHandler(proxy) opener =

关于一个技术小白的…… 1万+

工厂自动化布线实战:从功率计算到线槽布局的完整避坑指南

本文详细介绍了工厂自动化布线的实战经验,从功率计算到线槽布局的完整避坑指南。通过三步计算法确定线径需求,强调电压降控制的重要性,并分享线槽布局的50%法则和强弱电分离技巧。特别针对移动设备和多芯信号线提供专业解决方案,帮助工程师避免常见错误,提升布线效率和质量。

weixin_29266007的博客 354

利用Python爬取Jira中的数据

【代码】利用Python爬取Jira中的数据。

qq_39780125的博客 1602

宝塔面板磁盘扩容后不生效?5步搞定Linux服务器磁盘空间更新(附详细命令)

本文详细解析了Linux服务器磁盘扩容后宝塔面板显示不生效的常见问题。通过理解磁盘、分区、文件系统三层逻辑,提供5步解决方案:检查磁盘状态、安装growpart工具、扩展分区、使用resize2fs命令扩展文件系统,并最终验证结果。文中附有详细命令和针对XFS、LVM等进阶场景的指南,帮助用户彻底解决磁盘空间更新问题。

weixin_29271263的博客 128

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1091

python爬虫爬取网站_Python爬虫抓取网站所有url

用这个JIRA自己的API吧. 临时写了一个,已经在需要认证和不需要认证的环境下都测试过.希望有帮助.#!/usr/bin/env python# -*- coding: utf-8 -*-import requestsimport sysimport getpassimport json#Disable jira.atlanssion.com HTTPs Warnings.import urll...

weixin_39660931的博客 298

Gbase 8a GDCA考试真题100%

本文整理一些Gbase 8a中非常易错得考试真题及答案,而且都是不好搜的。加粗的是正确答案。

打工之路,一路生花 4305

python excel案例导入jira_使用 python 统计 jira 数据

前提首先JIRA就不多做介绍了,应该没有同学没接触过jira吧,很多公司都在用它来管理版本、需求、缺陷等。我司也不例外,所有的需求、测试等全在jira上面,所有的测试申请都是由开发同学在JIRA建一个TEST的申请,然后转到测试同学,每一轮测试结束后,开发同学会在comment中添加版本地址(内部成为build),这次介绍的脚本主要用于统计测试申请及每个测试申请的build数目如下面两张图所示:脚...

weixin_39917811的博客 405

基于深度学习YOLOv8的花卉检测与识别系统(附完整资源+PySide6界面+训练代码)

通过本项目,我们成功实现了基于YOLOv8的花卉检测与识别系统,涵盖了数据预处理、模型训练、推理与实时检测、以及GUI界面的实现。YOLOv8在花卉检测中的高效性和准确性为实际应用提供了强有力的支持。

斌擎科技 716

Hermes Agent 桌面版安装部署完全指南:一步步安装自进化Agent智能体

是由开发的开源自主 AI 智能体(MIT 协议)。它不是绑定在集成编辑器上的编码助手,也不是围绕单一 API 的聊天机器人封装——它是一个越用越强大的自主智能体,拥有独一无二的闭环学习系统特性说明自主技能创建在复杂任务后自动生成可复用的 Skills(技能)技能自我改进使用过程中持续优化已有技能持久化记忆跨会话记住你的项目、偏好和解决方案用户画像建模通过 Honcho 方言式推理,逐步构建对你的深度理解20+ 平台接入。

大模型与Agent智能体 7766

JIra+Python+Pyechart 通过分析jira数据生成图表并展示,出具质量可视化的测试报告

JIra+Python+Pyechart 通过分析jira数据生成图表并展示,出具质量可视化的测试报告

qq_36701194的博客 4833

【YOLO26实战全攻略】10——YOLO26+SAM3实战:从检测到像素级分割的全流程指南(含PCB缺陷检测案例)

本文聚焦YOLO26与SAM3的融合应用,系统讲解“检测+分割”的三种核心模式:YOLO26原生分割(轻量高效)、YOLO26检测+SAM3精细分割(精度极致)、SAM3自动标注+YOLO26蒸馏(低成本冷启动)。从环境搭建、数据集准备、模型训练、性能优化到边缘部署,提供 step-by-step 实操教程,配套完整可运行代码与执行结果。结合虚拟PCB缺陷检测案例,展示像素级缺陷识别与几何参数测量的工业级应用流程。本文兼顾新手入门与进阶提升,注重实用价值,读者可直接参考搭建自己的分割系统。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 625

从 JIRA 数据到可视化洞察:使用 Python 创建自定义图表

从 JIRA 数据到可视化洞察:使用 Python 创建自定义图表

喵酱 1610

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

如何用 Python 统计 Jira 数据并可视化

目前公司使用Jira作为项目管理工具,在每一次迭代完成后的复盘会上,我们都需要针对本次迭代的Bug进行数据统计,以帮助管理层能更直观的了解研发的代码质量。通过上面的操作,每次只需要输入项目类型、迭代版本号、要统计的Bug类型,就能统计出所需要的数据并绘制成图表。,每日干货分享,内容覆盖Python电子书、教程、数据库编程、Django,爬虫,云计算等等。需要注意的是,使用a标签组装的链接不能直接跳转,需要针对数据进行二次替换才能正常进行链接跳转。2-2根据项目类型获取看板id。...

m0_71327177的博客 489

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

利用python 查询操作JIRA中的issues

背景描述 最近有个需求是获取某些符合条件的jira数据,在统计后使用echarts可视化度量出来。后端代码打算用 Python实现 问题解决 这里着重说下后台获取jira数据的代码。python有一个非常好用的jira操作库jira-python。这里有其非常友好的文档说明。下面权当是对文档的摘抄复述吧! 安装 如果Python环境中集成了pip的话,可以直接使用如下命令安装: pip ins...

xiaobai_ol的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python开发的项目管理软件_python jira api

JIRA python篇之统计产品尚未解决的bugs[本文出自天外归云的博客园]通过python中的jira类我们可以方便的操作jira,获取一些我们想要再加工的信息。一些通过JIRA的JTL查询语句不方便直接搜索的过滤条件可以通过JIRA的python api来完成。在产品上线之前,要统计本期产品尚未解决的bugs。前提:产品未解决的故障...文章天外归云2017-12-251320浏览量Mon...

weixin_39593498的博客 271

【2023新书】使用Python进行统计和数据可视化

来源:专知 本文为书籍介绍,建议阅读5分钟 本书旨在为有兴趣在数据科学和分析以及一般统计分析领域使用他们的技能的毕业生和商业从业人员在统计学方面提供帮助。本书旨在为有兴趣在数据科学和分析以及一般统计分析领域使用他们的技能的毕业生和商业从业人员在统计学方面提供帮助。一方面,本书旨在为那些上过一些统计学课程,但在日常工作中不一定使用过统计学的读者提供复习。另一方面,这些材料也适合第一次接触Python...

数据派THU 227

利用jira-python及selenium完成jira的统计报表及日报的填写

最近需要统计公司项目的jira项并需要将统计内容更新到confluence上,故利用jira-python及selenium编写相应的自动化脚本,避免重复性工作。 1 from selenium import webdriver 2 from selenium.webdriver.common.by import By 3 from jira.client import JI...

weixin_34001430的博客 393

Jenkins+飞书机器人:自动化Jira缺陷统计与智能推送实战

本文详细介绍了如何利用Jenkins与飞书机器人实现Jira缺陷的自动化统计与智能推送。通过定时抓取Jira数据、智能分类统计,并生成交互式飞书消息卡片,帮助开发团队实时掌握缺陷状态,提升工作效率。文章包含环境配置、核心代码实现及Jenkins流水线配置等实战内容。

weixin_30376509的博客 210

智能测试报告生成:集成Jira+ChatGPT可视化实战

随着AI技术的兴起,集成工具如Jira(用于测试管理)和ChatGPT(用于智能分析)已成为变革性解决方案。示例prompt: “基于以下Jira缺陷数据,生成一份测试报告摘要:缺陷总数=50,严重缺陷占比20%,平均修复时间=2天。:过滤无效条目(如重复缺陷),并转换为结构化格式(如JSON或CSV)。:将数据导入数据库(如MySQL或MongoDB),设置定时任务(如cron job)实现实时更新。:基于历史数据,输出缺陷率变化曲线(如“Q1缺陷率下降10%,因自动化测试提升”)。

2501_94261392的博客 408
上一篇: 办公利器:用Python向钉钉发送消息
下一篇: 神器,这个Python神器竟能把图片视频无损清晰放大N倍
程序员小六
博客等级 码龄6年 111粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值