Python 统计Jira的bug 并发送邮件功能

1.首先在pycharm上使用pip安装

 pip install html-table
 pip install jira 

2.初始化发件人邮箱,账号,密码

# 发件人邮箱账号
my_sender = 'username@xxx.com.cn'
# user登录邮箱的用户名,password登录邮箱的密码(授权码,即客户端密码,非网页版登录密码),但用腾讯邮箱的登录密码也能登录成功
my_pass = 'xxxxx'
# 收件人邮箱账号
my_users=['username@xxx.com.cn']

3.登录Jira

class JiraTool:
#初始化
    def __init__(self):
        self.server = 'http://ip:5500' //连接Jira的Ip地址
        self.basic_auth = ('username', 'password') //连接Jira的账户和密码
        self.jiraClinet = None

4.登录Jira

def login(self):
    self.jiraClinet = JIRA(server=self.server, basic_auth=self.basic_auth)
    if self.jiraClinet != None:
        print("登录成功!")
        return True
    else:
        return False

5.获取Jira问题列表

def get_issue_list_by_jql(self, jql):
    issue_list = []
    issue_key_list = self.jiraClinet.search_issues(jql_str=jql,startAt=0,maxResults=1000) //Jira默认统计50条,maxResults设置大小
    for key_list in issue_key_list:
        issue = self.jiraClinet.issue(key_list.key)
        issue_list.append(issue)
        # print(issue.key) #关键字
        # print(issue.fields.summary) #bug描述
        # print(issue.fields.status) bug状态
        # print(issue.fields.assignee) #经办人
        # print(issue.fields.components[0].name) #模块
        # print(issue.fields.priority) #优先级
    return issue_list

6.创建一个表格

def gen_new_bug_caption_str(issue_list):
    dict = {}
    for issue in issue_list:
        dict[issue.fields.status.name] = dict.get(issue.fields.status.name, 0) + 1
        #dict[issue.key.split('-')[0]] = dict.get(issue.key.split('-')[0],0) + 1
    caption_str = '近一周共计新增bug' + str(len(issue_list)) + '个。 已关闭:' + str(dict.get('已关闭')) + '个。 已解决待关闭:' + str(dict.get('已解决')) + '个。 待处理:' +str(dict.get('待处理')) + '个'
    #print(caption_str)
    return caption_str

7.生成html

 #标题样式
    # table.caption.set_style({'font-size':'15px','align':'left'})
    table.caption.set_style({'font-size':'15px'})
    # 表格样式,即<table>标签样式
    table.set_style({
        'border-collapse':'collapse',
        'word-break':'keep-all',
        'white-space':'nowrap',
        'font-size':'14px'
    })

    #设置每个单元格的样式,主要是规定边框样式:
    table.set_cell_style({
        'border-color':'#000',
        'border-width':'1px',
        'border-style':'solid',
        'padding':'5px',
    })
    #设置表头单元格样式,规定颜色,字体大小,以及填充大小:
    #表头样式
    table.set_header_row_style({
        'color':'#fff',
        'background-color':'#696969',
        'font-size':'18px',
    })
    #覆盖表单单元格字体样式
    table.set_header_cell_style({
        'padding':'15px',
    })
    #遍历数据行,根据不同状态设置背景颜色
    for row in table.iter_data_rows():
        if row[1].value in "待处理":
            row[1].set_style({
                'background-color': '#FFB6C1',
            })
        if row[1].value in "已解决":
            row[1].set_style({
                'background-color': '#E1FFFF',
            })
        if row[1].value in "已关闭":
            row[1].set_style({
                'background-color': '#90EE99',
            })
        if row[1].value in "重新打开":
            row[1].set_style({
                'background-color': '#DC143C',
            })
        if row[1].value in "开发中":
            row[1].set_style({
                'background-color': '#f7d7a7',
            })
    #生成HTML文本:
    html = table.to_html()
    # print(html)
    return html

8.发送邮件

def sendmail(html):
    ret=True
    try:
        # 邮件内容
        msg=MIMEText(html,'html','utf-8')
        # 括号里的对应发件人邮箱昵称、发件人邮箱账号
        msg['From']=formataddr(["张三",my_sender])
        # 括号里的对应收件人邮箱昵称、收件人邮箱账号
        #msg['To']=formataddr(["李四",my_user])
        # 邮件的主题
        msg['Subject']="bug情况统计"
        server=smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)
        # 登录服务器,括号中对应的是发件人邮箱账号、邮箱密码
        server.login(my_sender, my_pass)
        # 发送邮件,括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
        server.sendmail(my_sender, my_users, msg.as_string())
        # 关闭连接
        server.quit()
        # 如果 try 中的语句没有执行,则会执行下面的 ret=False
    except Exception:
        ret=False
    return ret

9.调试

new_bug_jql = "project in (AAA, BBB, CCC)  AND issuetype in (Bug, 缺陷) AND created >= -1w ORDER BY component ASC, assignee ASC, priority DESC, updated DESC"
old_bug_jql = "project in (AAA, BBB, CCC)  AND issuetype in (Bug, 缺陷) AND status in (待处理, 开发中, Reopened) AND created <= -1w ORDER BY component ASC, assignee ASC, priority DESC, updated DESC"
jiraTool = JiraTool()
jiraTool.login()
new_issue_list = jiraTool.get_issue_list_by_jql(new_bug_jql)
new_bug_caption_str = gen_new_bug_caption_str(new_issue_list)
new_bug_html = gen_html_table(new_issue_list,new_bug_caption_str)
# print(new_bug_html)
old_issue_list = jiraTool.get_issue_list_by_jql(old_bug_jql)
old_bug_html = gen_html_table(old_issue_list, "超过一周未关闭bug")
eamil_html = (new_bug_html + "<br/><br/><br/>" + old_bug_html).replace("&gt;", ">").replace("&quot;", "\"").replace("&lt;", "<")
# print(eamil_html)
ret=sendmail(eamil_html)
if ret:
    print("邮件发送成功")
else:
    print("邮件发送失败")

到此这篇关于Python 统计Jira的bug 并发送邮件的文章就介绍到这了,更多相关Python 统计Jira的bug 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-01-13

Python用Jira库来操作Jira

Jira简介 Jira是一款功能非常强大的管理工具,广泛的用来 缺陷跟踪.用例管理.需求收集.任务跟踪.工时管理.项目计划管理等工作领域.所以使用这款产品的公司很多,这篇博客讲述在执行自动化测试用例过程中,将失败的用例自动在jira系统记录bug. 提供了完善的RESTful API,如果不想直接请求API接口可以使用Python的Jira库来操作Jira. 官方文档 一.安装 # 安装第三方jira库 pip install jira 二.认证 官网提供了4种认证方式: Cookie Base

Python中Cookies导出某站用户数据的方法

应朋友需要,想将某客户的数据从某站里导出,先去某站搞个账号,建几条数据观察一番,心里有底后开搞. 1.Python环境搭建 之前电脑有安装过PyCharm Community 2019.1,具体安装过程就不写了,先跑个HelloWorld,输出正常后正式开整. 2.利用抓包工具或者Google浏览器调试模式拿到请求参数 Cookies参数如下: cookies = { 'JSESSIONID': 'XXX', 'phone': 'XXX', 'password': 'XXX', 'isAuto'

浅谈Python中的异常和JSON读写数据的实现

异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try ... catch ... finally来处理异常,在Python中通过try ... except ... else来处理异常 一.以ZeroDivisionError为例,处理分母为0的除法异常 def division(numerator,denominator): result=numerator/denominator return result ret1=division(1,5) prin

python中使用input()函数获取用户输入值方式

我们编写程序最终目的还是来解决实际问题,所以必然会遇到输入输出的交互问题,python中提供了input函数用来获取用户的输入,我们可以用以下程序演示. user_gender = input("Please enter your gender(F/M):") print(f'Your gender is {user_gender}') 要注意的是在sublime编辑器中不支持input的在线输入,所以我们需要去cmd窗口运行这个程序,结果如下所示: 要注意的是input的返回值是字符

python中requests爬去网页内容出现乱码问题解决方法介绍

最近在学习python爬虫,使用requests的时候遇到了不少的问题,比如说在requests中如何使用cookies进行登录验证,这可以查看这篇文章.这篇博客要解决的问题是如何避免在使用requests的时候出现乱码. import requests res=requests.get("https://www.baidu.com") print res.content 以上就是使用requests进行简单的网页请求数据的方式.但是很容易出现乱码的问题. 我们可以通过在网页上右击查看

Python中使用django form表单验证的方法

一. django form表单验证引入 有时时候我们需要使用get,post,put等方式在前台HTML页面提交一些数据到后台处理例 ; <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Form</title> </head> <body> <div> <for

对python中xlsx,csv以及json文件的相互转化方法详解

最近需要各种转格式,这里对相关代码作一个记录,方便日后查询. xlsx文件转csv文件 import xlrd import csv def xlsx_to_csv(): workbook = xlrd.open_workbook('1.xlsx') table = workbook.sheet_by_index(0) with codecs.open('1.csv', 'w', encoding='utf-8') as f: write = csv.writer(f) for row_num

python中不能连接超时的问题及解决方法

要是我们大天朝的防火墙技术进步神速 解决方法 #只有修改pip源了. #临时使用: pip install pythonModuleName -i https://pypi.douban.com/simple #修改默认的软件源: #修改/etc/pip.conf 文件,即可为所有用户配置. liunx #修改~/.pip/pip.conf为当前用户配置. linux #windows下pip配置文件为 C:\Users\xx\pip\pip.ini ,没有就新建 最终变成了这样 •好的这就完成

Python中pyecharts安装及安装失败的解决方法

pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS 库.这篇文章重点给大家介绍pyecharts安装失败的处理方法,具体详情如下: pyecharts库的安装 1.正常安装 首先在打开终端输入以下命令:pip install pyecharts 在终端输入pip list查看是否安装成功测试程序: from pyecharts.charts import Bar bar = Bar() bar.add_xaxis(["衬衫"

python调用HEG工具批量处理MODIS数据的方法及注意事项

下面的代码主要用于使用python语言调用NASA官方的MODIS处理工具HEG进行投影坐标转换与重采样批量处理 主要参考 HEG的用户手册:https://newsroom.gsfc.nasa.gov/sdptoolkit/HEG/HEG215/EED2-TP-030_Rev01_HEG_UsersGuide_2.15.pdf HEG批处理帮助:https://newsroom.gsfc.nasa.gov/sdptoolkit/HEG/HEG_Batch_job_Help.htm 主要的注意事

python中读入二维csv格式的表格方法详解(以元组/列表形式表示)

如何去读取一个没有表头的二维csv文件(如下图所示)? 并以元组的形式表现数据: ((1.0, 0.0, 3.0, 180.0), (2.0, 0.0, 2.0, 180.0), (3.0, 0.0, 1.0, 180.0), (4.0, 0.0, 0.0, 180.0), (5.0, 0.0, 3.0, 178.0)) 方法一,使用python内建的数据处理库: #python自带的库 rows = open('allnodes.csv','r',encoding='utf-8').readl

python中获得当前目录和上级目录的实现方法

获取当前文件的路径: from os import path d = path.dirname(__file__) #返回当前文件所在的目录 # __file__ 为当前文件, 若果在ide中运行此行会报错,可改为 #d = path.dirname('.') 获得某个路径的父级目录: parent_path = os.path.dirname(d) #获得d所在的目录,即d的父级目录 parent_path = os.path.dirname(parent_path) ##获得parent_p