十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python:JIRA操作

Python:JIRA操作 curlcurl -i https://jira.******.com/200!200检查server地址curl -i -u username:password https://jira.******.com/python jira.exceptions.JIRAError: JiraError HTTP 401401没证明你是谁认证失败: 检查用户名密码python jira.exceptions.JIRAError: JiraError HTTP 403403证明了但没资格授权失败 用 个人访问令牌Personal Access Token (PAT)鉴权(个人访问令牌Personal Access Tokenjira登录用户信息中申请)curl -i -H Authorization:personal_access_oken https://jira.******.com/200个人访问令牌token_auth# !/usr/bin/env python # -*-coding:utf-8 -*- import os from jira import JIRA, Issue class JiraTool: def __init__(self, personal_access_oken, projectNone): self.server https://jira.******.com self.personal_access_oken personal_access_oken self.project project # 个人访问令牌jira登录-用户信息中申请 self.jira_conn JIRA(serverself.server, token_authself.personal_access_oken) def get_projects(self): 访问权限的项目列表:[JIRA Project: keyAR2022011, name识别, id12882,...] # for p in self.jira_conn.projects(): # print(p.key, p.id, p.name) return self.jira_conn.projects() if __name__ __main__: personal_access_oken NjQxMD****************************XEm8 jiratool JiraTool(personal_access_oken) # # 获取用户所有project projects jiratool.get_projects() print(projects)用户名/密码basic_auth# !/usr/bin/env python # -*-coding:utf-8 -*- import os from jira import JIRA, Issue class JiraTool: def __init__(self, username, password, projectNone): self.server https://jira.******.com self.username username self.password password self.project project self.jira_conn JIRA(serverself.server, basic_auth(self.username, self.password)) # jira服务器用户名密码 def get_projects(self): 访问权限的项目列表:[JIRA Project: keyAR2022011, name识别, id12882,...] # for p in self.jira_conn.projects(): # print(p.key, p.id, p.name) return self.jira_conn.projects() def get_project(self, project_id): 通过项目id/key获取项目主要属性 key: 项目的Key name: 项目名称 description: 项目描述 lead: 项目负责人 projectCategory: 项目分类 components: 项目组件 versions: 项目中的版本 raw: 项目的原始API数据 project { key:self.jira_conn.project(project_id).key, name:self.jira_conn.project(project_id).name, description:self.jira_conn.project(project_id).description, lead:self.jira_conn.project(project_id).lead, components:self.jira_conn.project(project_id).components, versions:self.jira_conn.project(project_id).versions, raw:self.jira_conn.project(project_id).raw } return project def search_jira_jql(self, jqlNone, maxnum: int None): 根据jql查询jira,返回[JIRA Issue: keyPJT-9141, id302682,...] maxResults False if maxnum is None else maxnum issues self.jira_conn.search_issues(jql, maxResultsmaxResults,json_resultFalse) return issues def create_issue(self, issue_dict): 创建issue,issue_dict { project: {id: 10000}, summary: BUG描述, description: BUG详情 \n换行, priority: {name: BUG优先级}, labels: [标签], issuetype: {name: 问题类型-故障}, assignee:{name: 经办人} #经办人 } self.jira_conn.create_issue(fieldsissue_dict) def create_issues(self, issue_list): 批量创建issue,issue_list [issue_dict1, issue_dict2, issue_dict3] self.jira_conn.create_issues(issue_list) def get_issue(self, issue_id): 获取issue信息 issue self.jira_conn.issue(issue_id) return issue def get_issuefields(self, issue_id): 获取issue-fields信息: issuefields vars(self.get_issue(issue_id).fields) return issuefields def get_summary(self, issue_id): 获取issue-summary信息: issuefields self.get_issue(issue_id).fields return issuefields.summary def get_issuelabels(self, issue_id): 获取issue-issuelabels信息: issuefields self.get_issue(issue_id).fields labels issuefields.labels return labels def get_status(self, issue_id): 查询状态 return self.jira_conn.issue(issue_id).fields.status def get_assignee(self, issue_id): 查询assignee return self.jira_conn.issue(issue_id).fields.assignee.name def find_description(self, issue_id): 查询description信息 return self.jira_conn.issue(issue_id).fields.description def update_issue(self, issue_id,issue_dict): 创建issue,issue_dict { project: {id: 10000}, summary: BUG描述, description: BUG详情 \n换行, priority: {name: BUG优先级}, labels: [标签], issuetype: {name: 问题类型-故障}, assignee:{name: 经办人} #经办人 } update(assignee{name: username}) self.jira_conn.issue(issue_id).update(issue_dict) def get_versions(self, jira_key): # 获取Jira影响版本 versions [ v.name for v in self.jira_conn.issue(jira_key).fields.versions] return versions def add_version(self, jira_key, versions_name): # 为Jira添加影响版本,注意新增的版本在JIRA中是否存在,否则报错 self.jira_conn.issue(jira_key).add_field_value(versions, {name: versions_name}) def del_version(self, jira_key,versions_name): # 获取Jira影响版本 oldversions [ i.name for i in self.jira_conn.issue(jira_key).fields.versions] newversions oldversions if versions_name in oldversions: oldversions.remove(versions_name) newversions oldversions versions [ {name: f} for f in newversions] self.jira_conn.issue(jira_key).update(fields{ versions : versions }) def get_fixversions(self, jira_key): # 获取Jira影响版本 fixVersions [ v.name for v in self.jira_conn.issue(jira_key).fields.fixVersions] return fixVersions def add_fixversions(self, jira_key, fixversions_name): # 为Jira添加解决版本,注意新增的版本在JIRA中是否存在,否则报错 self.jira_conn.issue(jira_key).add_field_value(fixVersions, {name: fixversions_name}) def del_fixversions(self, jira_key,versions_name): # 获取Jira影响版本 oldfixversions [ i.name for i in self.jira_conn.issue(jira_key).fields.fixVersions] newfixversions oldfixversions if versions_name in oldfixversions: newfixversions.remove(versions_name) newfixversions oldfixversions versions [ {name: f} for f in newfixversions] self.jira_conn.issue(jira_key).update(fields{ fixVersions : versions }) def add_field_value(self,issue_id,key,value): issue self.jira_conn.issue(issue_id) issue.add_field_value(fieldkey,valuevalue) def add_attachment(self, jira_key, picpath): 上传附件 issue self.jira_conn.issue(jira_key) with open(picpath, rb) as f: self.jira_conn.add_attachment(issue, attachmentf) f.close() def get_comments(self, issue_id): 查询comments comments self.jira_conn.issue(issue_id).fields.comment.comments # return { comment.id:comment.author for comment in comments} # return { comment.id:comment.body for comment in comments} return comments def add_comment(self, jira_key,context,picpathNone): 添加comment if picpath is None or not os.path.exists(picpath): comment context else: self.add_attachment(jira_key, picpath) picname os.path.basename(picpath) comment f{context}\r\n!{picname}|thumbnail! self.jira_conn.add_comment(jira_key, comment) def update_comment(self, issue_id,comment_id,n_comment): 更新comment issue self.jira_conn.issue(issue_id) comment self.jira_conn.comment(issue,comment_id) comment.update(bodyn_comment) def get_transitions(self, issue_id): 查询当前权限下问题流程可操作节点 issue self.jira_conn.issue(issue_id) transitions self.jira_conn.transitions(issue) return [(t[id], t[name]) for t in transitions] def update_status(self, issue_idNone, statusNone, **kwargs): 更新问题流程状态 issue self.jira_conn.issue(issue_id) self.jira_conn.transition_issue(issue, status, **kwargs) def close_client(self): # 关闭链接 self.jira_conn.close() if __name__ __main__: jiratool JiraTool(username******, password******) # # 获取用户所有project # projects jiratool.get_projects() # print(projects) # for p in projects: # print(p.key,p.id,p.name) # # 获取project信息 # project jiratool.get_project(PJT) # print(project) # # jql查询jira问题 # jql ******** # issues jiratool.search_jira_jql(jql) # print(issues) # # jira_key # for i in issues: # print(i.key) # jira_key [i.key for i in issues] # print(jira_key) # labels [] # for issue in issues: # issueinfo jiratool.get_issuefields(issue) # labels.extend(list(issueinfo[labels])) # print(issue,,.join(list(issueinfo[labels]))) # # keys sorted(set(labels)-set((***,***))) # print(keys) # dd {k:labels.count(k) for k in keys} # # for k in keys: # print(k,labels.count(k)) # print(sum(list(dd.values()))) # # 添加附件 # picpath rE:\Attachments\PJT-7533.png # jiratool.add_attachment(PJT-7984,picpath) # # # 添加注释附件 # context r版本回归Pass\n汇总****** # jiratool.add_comment(PJT-7984,context,picpath) # # # 获取issue信息 # issueinfo jiratool.get_issuefields(PJT-9676) # print(issueinfo) # # labels list(issueinfo[labels]) # jira_key PJT-7669 # # # # 查询当前权限下问题流程可操作节点 # transitions jiratool.get_transitions(jira_key) # print(transitions) # # # # 获取issue-status信息 # status str(jiratool.get_status(jira_key)) # assignee jiratool.get_assignee(jira_key) # print(assignee) # print(status,type(status)) # # 修改状态 # jiratool.update_status(jira_key, 31, customfield_12017examine) # # 获取issue-description信息,修改描述信息 # description jiratool.find_description(PJT-12537) # print(description,type(description)) # description description \n版本号v10.0.1 test # jiratool.update_issue(PJT-12537,{description: description}) # 获取issue-标签 # labels jiratool.get_issuelabels(issue) # # 添加或删除标签 # labels.append(CICD) # # labels.remove(CICD) # jiratool.update_issue(PJT-9676,{labels: labels}) # # 修改优先级 # jiratool.update_issue(PJT-9676,{priority: {name: High}}) # # # 获取comment # comments jiratool.get_comments(PJT-7470) # print(comments) # for comment in comments: # if comment.author.displayName in (***,***): # print(comment.id,comment.body) # 添加影响版本 # jira_key PJT-9145 # jiratool.add_version(jira_key,PJT_V14.1.0) # 添加修复版本 jira_key PJT-11454 # jiratool.add_fixversions(jira_key,PJT_V14.1.0) versions jiratool.get_versions(jira_key) print(versions) # versions jiratool.del_version(jira_key,PJT_V14.1.0) # print(versions) fixversions jiratool.get_fixversions(jira_key) print(fixversions) jiratool.add_fixversions(jira_key,PJT_V14.1.0) fixversions jiratool.get_fixversions(jira_key) print(fixversions) jiratool.del_fixversions(jira_key,PJT_V14.1.0) fixversions jiratool.get_fixversions(jira_key) print(fixversions)
返回列表