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/8/13 16:43:55 阅读更多 →
OpenCode工具:Windows多语言开发环境配置与管理

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

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

2026/8/13 16:43:55 阅读更多 →
OpenClaw补丁工具apply_patch原理与应用指南

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

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

2026/8/13 16:43:55 阅读更多 →

最新新闻

MES 系统的主要功能模块详解

MES 系统的主要功能模块详解

1. 引言 MES(Manufacturing Execution System,制造执行系统)是面向制造企业车间执行层的生产信息化管理系统。它位于企业上层 ERP 与底层工业控制之间,负责将生产计划转化为可执行的操作指令,并实时采集、监控和反馈生…

2026/8/13 20:02:36 阅读更多 →
提升Android应用聊天体验:Chateau框架高级特性实战

提升Android应用聊天体验:Chateau框架高级特性实战

提升Android应用聊天体验:Chateau框架高级特性实战 【免费下载链接】Chateau Chateau is a framework for adding (or improving) chat functionality in any Android app 项目地址: https://gitcode.com/gh_mirrors/cha/Chateau Chateau是一个专为Android应…

2026/8/13 20:02:36 阅读更多 →
Sprite Kit动画优化秘诀:SKTUtils的24种缓动函数全解析

Sprite Kit动画优化秘诀:SKTUtils的24种缓动函数全解析

Sprite Kit动画优化秘诀:SKTUtils的24种缓动函数全解析 【免费下载链接】SKTUtils Sprite Kit helper classes and functions. From the book iOS Games by Tutorials. 项目地址: https://gitcode.com/gh_mirrors/sk/SKTUtils Sprite Kit作为iOS游戏开发的核…

2026/8/13 20:02:36 阅读更多 →
从0到1部署triangular-arbitrage:Windows与Linux系统安装教程

从0到1部署triangular-arbitrage:Windows与Linux系统安装教程

从0到1部署triangular-arbitrage:Windows与Linux系统安装教程 【免费下载链接】triangular-arbitrage 数字货币-三角套利机器人 项目地址: https://gitcode.com/gh_mirrors/tr/triangular-arbitrage triangular-arbitrage是一款功能强大的数字货币三角套利机…

2026/8/13 20:02:36 阅读更多 →
Go语言结构体验证革命:validator库如何提升开发效率300%

Go语言结构体验证革命:validator库如何提升开发效率300%

Go语言结构体验证革命:validator库如何提升开发效率300% 【免费下载链接】validator :100:Go Struct and Field validation, including Cross Field, Cross Struct, Map, Slice and Array diving 项目地址: https://gitcode.com/GitHub_Trending/va/validator …

2026/8/13 20:02:36 阅读更多 →
3个简单配置,让Jupyter Notebook成为你的数据科学得力助手!

3个简单配置,让Jupyter Notebook成为你的数据科学得力助手!

3个简单配置,让Jupyter Notebook成为你的数据科学得力助手! 【免费下载链接】notebook Jupyter Interactive Notebook 项目地址: https://gitcode.com/GitHub_Trending/no/notebook 你是否曾经在Jupyter Notebook中处理复杂数据时感到束手束脚&am…

2026/8/13 20:01:36 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →