Python与Jira的搭配使用详解(2)

  • 引言
  • 一、获取项目的信息
  • 1.1 获取单个项目或者所有项目
  • 1.2 获取项目的属性
  • 二、获取项目的所有BUG数据
  • 2.1 获取项目的所有issue清单
  • 2.2 获取issue的详细属性
  • 2.3 替换描述中的附件名称
  • 2.4 下载issue附件
  • 2.5 补充评论带上附件
  • 三、链接参考


引言

继上次文章写了如何通过Python向jira自动化写入BUG,本次介绍如何使用python获取Jira项目中的项目信息或者缺陷的信息,这对于我们进行后面的数据操作、数据分析非常方便。想像这样的一种情况,老板突然让你拿出数据,如果你使用JIra上去寻找数据,慢不说还不能很好的进行整体数据分析。如果你学会了这个方法,也许就点一下,所有的报告自动给你生成。你所需要的就是维护一次脚本,一劳永逸!连老板都忍不住对你竖起大拇指。

一、获取项目的信息

1.1 获取单个项目或者所有项目

具体请见代码。这里通过是否传递参数来进行返回。注意ID可以是项目的ID或者项目的KEY。

def getProjects(self,id=None):
        """
        如果传入的未传参数,则返回全部项目,反之则返回对应的项目。
        :param id: ID或者KEY
        :return: 返回全部或者某一个项目
        """
        if id == None:
            return self.jira.projects()
        else:
            return self.jira.project(id=id)

1.2 获取项目的属性

这里我以一个项目为例,多个项目做个循环就行。具体见代码。

def getProjectAttributes(self,id):
        """
        该方法用来返回项目的详细信息。
        :param id: 项目的ID或KEY
        :return:返回项目属性的字典
        """
        pro_dict = {}
        project = self.getProjects(id=id)
        pro_dict['id'] = project.id
        pro_dict['key'] = project.key
        pro_dict['name'] = project.name
        pro_dict['descri'] = project.description
        pro_dict['leader'] = project.lead
        pro_dict['components'] = project.components
        pro_dict['verisons'] = project.versions
        pro_dict['raw'] = project.raw   #项目的原始数据。
        return pro_dict

二、获取项目的所有BUG数据

这里需要使用Jira的jql语句。通过点击高级就可以看到jql语句,我们这里使用这个语句就行。

JIRA运行python脚本 python的jira模块_数据


点击之后出现就是jql语句,这和sql语句用法一致。

project = DEMO AND issuetype = 故障 ORDER BY created DESC, updated DESC

2.1 获取项目的所有issue清单

根据项目的id或者key,返回的是含bug数据的一个列表。方法如下:

def getBugList(self,id,issuetype):
        """
        :param id: 项目的id
        :param issuetype: 问题类型--这里选择故障
        :return:返回<class 'jira.client.ResultList'>,返回对象可以提取缺陷的id和key
        """
        jql = f'project = {id} AND issuetype = {issuetype}' \
            f' order by created DESC'
        bug_list = self.jira.search_issues(jql_str=jql, startAt=0, maxResults=False)  #这里没有限制bug数量,所有的都可以返回回来
        return bug_list

2.2 获取issue的详细属性

这里评论获取的是单条评论的原始数据raw,是一个字典类型,可以方便的获取想要的数据。请查看以下的方法。

def getBugAttributes(self,issue_id):
        """
        # print(raw["author"]["displayName"])
        # print(raw["body"])
        # print(raw["created"])
        # print(raw["updated"])
        :param issue_id: 缺陷的id
        :return: 返回包含缺陷信息的评论和信息
        """
        field = self.jira.issue(id=issue_id).fields   #问题域
        comment_id = self.jira.comments(issue_id)
        raw = self.jira.comment(issue_id, comment=comment_id[0]).raw  #得到评论的原始数据
        bug_dict = {
            "bug_id":issue_id,
            "labels":field.labels,
            "issuetype":field.issuetype,
            "title":field.summary,
            "descri":field.description,
            "priority":field.priority,
            "status":field.status.name,
            "reporter":field.reporter,
            "creator":field.creator,
            "assignee":field.assignee,
            "created_time":field.created,
            "updated_time":field.updated,
            "comments":raw
        }
        return bug_dict

2.3 替换描述中的附件名称

上面的方法在获取描述的时候,有时候里面含有附件的时候,则会出现一些看不懂的名称,所以这里我们讲解使用方法来获取附件并替换这些内容为正常的内容。

def replaceDesci(self,issue_id):
        """
        :param issue_id: issue_id
        :return: 返回替换后的描述
        """
        fields = self.jira.issue(id=issue_id, expand="attachment").fields
        pictures = fields.attachment
        description = fields.desciption
        for j in pictures:
            description = description.replace("!" + j.filename + "|thumbnail!", "请查看附件截图")
        if description == None or description == "" or description == "None":
            description = "无"
        return description

2.4 下载issue附件

该方法用来下载issue的附件。

def getBugAttachments(self,issue_id):
        """
        :param issue_id: issue_id
        :return: 保存所有附件,如果没有附件则提示信息
        """
        fields = self.jira.issue(id=issue_id, expand="attachment").fields
        attachments = fields.attachment
        if len(attachments) != 0:
            for i in range(len(attachments)):
                file_name = f"{attachments[i].filename}"
                path = f"../attachment/{file_name}"
                with open(path, "wb") as f:
                    f.write(attachments[i].get())
        else:
            print("没有附件")

2.5 补充评论带上附件

该方法继承了原来的的类(IssuesCreate),重写了方法add_comment.可以实现添加评论和附件。

def add_comment(self, issue_id,comment_text, picpath=None,filename = None):
        """
        :param filename:附件名字
        :param issue_id: issue_id
        :param comment_text: 评论内容
        :param picpath: 附件路径
        :return:
        """
        if picpath is None or filename == None:
            comment = comment_text
        else:
            self.add_attachment(issue_id, picpath,filename=filename)
            comment = f"{comment_text}\r\n!{filename}|thumbnail!"
        self.jira.add_comment(issue_id, comment)