使用atlassian库创建Jira Issue时遇400错误,求排查方案
Jira API创建Issue报错排查问题
问题场景
使用Python 3.8结合atlassian库创建Jira Issue,代码如下:
from atlassian import Jira import datetime # 原代码缺失该导入,属于笔误 jira = Jira( url='http://jira.mydomain.com/', username='login', password='password') summary = 'Test summary' description = 'Test description' current_date = datetime.date.today() duedate = datetime.datetime.strftime(current_date, "%Y-%m-%d") fields = {"project": {"key": 'ARL'}, "summary": summary, "description": description, "issuetype": {"name": "Task"}, "duedate": duedate, "labels": ["Demo"], "components": [{"name": "Selary"}] }
执行后触发400 Bad Request错误,完整报错栈:
Creating issue "Test summary" Traceback (most recent call last): File "C:\Users\Max\PycharmProjects\GSheets-Test\venv\lib\site-packages\atlassian\rest_client.py", line 436, in raise_for_status j.get("errorMessages", list()) + [k.get("message", "") for k in j.get("errors", dict())] File "C:\Users\Max\PycharmProjects\GSheets-Test\venv\lib\site-packages\atlassian\rest_client.py", line 436, in <listcomp> j.get("errorMessages", list()) + [k.get("message", "") for k in j.get("errors", dict())] AttributeError: 'str' object has no attribute 'get' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\Max\PycharmProjects\GSheets-Test\test.py", line 37, in <module> print(jira.issue_create(fields_arl)) File "C:\Users\Max\PycharmProjects\GSheets-Test\venv\lib\site-packages\atlassian\jira.py", line 1402, in issue_create return self.post(url, data={"fields": fields}) File "C:\Users\Max\PycharmProjects\GSheets-Test\venv\lib\site-packages\atlassian\rest_client.py", line 333, in post response = self.request( File "C:\Users\Max\PycharmProjects\GSheets-Test\venv\lib\site-packages\atlassian\rest_client.py", line 257, in request self.raise_for_status(response) File "C:\Users\Max\PycharmProjects\GSheets-Test\venv\lib\site-packages\atlassian\rest_client.py", line 440, in raise_for_status response.raise_for_status() File "C:\Users\Max\PycharmProjects\GSheets-Test\venv\lib\site-packages\requests\models.py", line 960, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: http://jira.mydomain.com/rest/api/2/issue
已知信息:
- 切换到其他项目密钥时,Issue可成功创建
- 管理员称两个项目业务方案、必填字段集合一致,代码中指定的组件"Selary"在ARL项目中存在
- 给正常项目传入错误组件名称时,会触发相同错误
- 更换登录账号后问题依旧
错误核心原因
atlassian库的异常处理逻辑预期Jira返回的错误格式是字典列表,但实际返回了字符串,导致抛出AttributeError。但本质是ARL项目存在隐性配置差异,导致Issue创建请求的参数校验失败,触发了Jira的非标准错误响应格式。
需要检查的项目/字段配置
- 组件与问题类型的关联限制:确认ARL项目中,"Task"类型的Issue是否允许关联"Selary"组件。部分项目会配置组件仅能绑定特定问题类型,即使组件存在,类型不匹配也会报错。
- 项目级字段的特殊配置:检查ARL项目是否在全局业务方案之外,单独设置了某些字段为必填/隐藏。比如全局非必填的字段,在ARL项目中被设为必填,但代码未传入对应值。
- 工作流初始状态的字段要求:验证ARL项目中"Task"类型的初始工作流状态,是否强制要求填写某些字段,而代码未提供这些字段的值。
- 组件的权限配置:确认"Selary"组件是否设置了仅特定用户/组可关联,即使账号有项目权限,也可能缺少组件关联权限(更换账号后问题依旧,可排除单个账号问题,但需确认组件的全局权限规则)。
- 日期格式的兼容性:检查ARL项目所在Jira实例是否对
duedate格式有特殊要求,虽然代码用的是%Y-%m-%d标准格式,但本地化配置的Jira可能需要带时间戳的格式。 - 问题类型的创建权限:确认登录账号(或所属用户组)在ARL项目中是否拥有"创建Task类型Issue"的权限,即使能访问项目,也可能缺少特定问题类型的创建权限。
- 获取原始API错误信息:绕过
atlassian库的异常处理,直接用requests发送请求查看Jira返回的具体错误提示,这能精准定位问题字段。示例代码:
import requests import json url = "http://jira.mydomain.com/rest/api/2/issue" auth = ("login", "password") headers = {"Content-Type": "application/json"} data = {"fields": fields} response = requests.post(url, auth=auth, headers=headers, data=json.dumps(data)) print(response.status_code) print(response.text)
内容的提问来源于stack exchange,提问作者Max Chupin
相关产品推荐
相关产品推荐

