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)

相关新闻

word页眉页脚,奇偶不同

word页眉页脚,奇偶不同

word页眉页脚的编辑,奇偶不同一点知识补充分页符 分节符 ???格式要求正文页码页眉结果总结一点知识补充 分页符 分节符 ??? 分页符和分节符两者效果看起来没啥区别,都是希望下一段…

2026/10/30 1:41:04 阅读更多 →
OpenCode工具:Windows多语言开发环境配置与管理

OpenCode工具:Windows多语言开发环境配置与管理

1. OpenCode工具定位与核心价值OpenCode作为一款新兴的开发者工具,正在GitHub等开源社区快速走红。它本质上是一个轻量级的代码管理平台,主要解决开发者在Windows环境下进行多语言项目协作时的三大痛点:环境配置复杂:传统开发环境…

2026/11/11 8:45:08 阅读更多 →
OpenClaw补丁工具apply_patch原理与应用指南

OpenClaw补丁工具apply_patch原理与应用指南

1. OpenClaw与apply_patch工具概述OpenClaw作为一款新兴的开源工具集,近期在开发者社区中引发了广泛讨论。这个项目最初因其独特的"人人养虾"理念吸引了我的注意——通过模块化设计和补丁机制,让每个用户都能像培育虾苗一样定制自己的AI工作流…

2026/11/9 0:26:15 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/10 23:32:01 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/10 23:32:03 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/11 2:31:33 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/11 17:16:37 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/11 17:16:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/10 23:32:10 阅读更多 →

日新闻

周新闻

月新闻