学习资料:
https://jira.readthedocs.io/en/master/examples.html#issues
https://www.jianshu.com/p/fdf0206c5331?utm_campaign=hugo
通过Python的Jira库来操作Jira
如何通过 Python 使用 Jira,目前主要是对 issue 进行增删改查操作。
Jira提供了完善的RESTful API,如果不想直接请求API接口可以使用Python的Jira库来操作Jira。
Issue是Jira的核心,Jira中的任务,用户Story,Bug实质上都是一个Issue。单个问题对象可以通过jira.issue(“问题的Key”)得到,问题的主要属性和方法如下:
创建/分配/转换问题
jira.create_issue(): 创建问题
jira.create_issues(): 批量创建问题
jira.assign_issue(): 分配问题
jira.transitions(): 获取问题的工作流
jira.transition_issue(): 转换问题
导入相关模块
from jira import JIRA
jira = JIRA(server=‘http://127.0.0.1:8080’, basic_auth=(‘user_name’, ‘password’))
新增 issue
new_issue = jira.create_issue(project='PROJ_key_or_id', summary='New issue from jira-python',description='Look into this one', issuetype={'name': 'Bug'})
效果等同于:
issue_dict = {
'project': {'id': 123},
'summary': 'New issue from jira-python',
'description': 'Look into this one',
'issuetype': {'name': 'Bug'},
}
new_issue = jira.create_issue(fields=issue_dict)
实例,提交BUG的代码实现如下:
issue_dict = {
'project': {'id': 10202},#项目id
'summary': '测试',#BUG概要
'description': '测试',#BUG详情
'priority': {'name':'Low'},#bug优先级
'assignee':{'name':'chengzi@x.com'},#分配人
'customfield_10316':{'name':'chengzi@x.com'},#责任人
'labels': ['大大项目'],#所属项目
'issuetype': {'id': 10004}#问题类型-故障
}
new_issue = jira.create_issue(issue_dict)
批量创建
issue_list = [
{
'project': {'id': 123},
'summary': 'First issue of many',
'description': 'Look into this one',
'issuetype': {'name': 'Bug'},
},
{
'project': {'key': 'FOO'},
'summary': 'Second issue',
'description': 'Another one',
'issuetype': {'name': 'Bug'},
},
{
'project': {'name': 'Bar'},
'summary': 'Last issue',
'description': 'Final issue of batch.',
'issuetype': {'name': 'Bug'},
}]
issues = jira.create_issues(field_list=issue_list)
删除 issue
issue = jira.issue(issue_key)
issue.delete()
更新 issue
issue = jira.issue('TEST-42')
issue.update(summary='new summary', description='A new summary was added')
issue.update(assignee={'name': 'new_user'}) # reassigning in update requires issue edit permission
查询 issue
#查询project信息
print (jira.projects()) #获取所有的projets
project =jira.project('SPDGT') #获取projet为SPDGT的信息
print (project.key) #获取项目的Key
print (project.name) #获取项目名称
print (project.lead) #获取项目负责人
print (project.description) #项目描述
print (project.components) #获取项目组件
print (project.raw) #获取项目的原始API数据
print (project.projectCategory) #获取项目分类
转换问题
jira.transition_issue(issue, ‘5’, assignee={‘name’: ‘pm_user’}, resolution={‘id’: ‘3’})
jira.transition_issue(issue, 目的状态)
PMS_STATUS_TRANSITION = {
u"进行中": {
u'ONLINE': ['51', '201', '131'],
u'ONLINING': ['51', '201', '131'],
u'DONE': ['51', '201'],
u'QUESTION': ['51'],
u'DOING': ['51', '71'],
u'PENDING': ['51'],
u'TOTEST': ['51'],
u'ABORTED': ['181', '151']
},
u"已提测": {
u'ONLINE': ['201', '131'],
u'ONLINING': ['201', '131'],
u'DONE': ['201'],
u'DOING': ['71'],
u'ABORTED': ['181', '151'],
u'ADMIT_NOPASS': ['61'],
u'ADMIT_RDNO': ['61'],
},
u"测试中": {
u'ONLINE': ['111', '131'],
u'ONLINING': ['111', '131'],
u'DONE': ['111'],
u'QUESTION': ['81'],
u'PENDING': ['81'],
u'TOTEST': ['81'],
u'TODO': ['81'],
u'ABORTED': ['181', '151']
},
u"测试通过": {
u'ONLINE': ['131'],
u'ONLINING': ['131'],
u'QUESTION': ['141'],
u'DOING': ['141', '71'],
u'PENDING': ['141'],
u'TOTEST': ['141'],
u'TODO': ['141'],
u'ABORTED': ['181', '151']
},
u"已上线": {
u'DONE': ['171', '141', '111'],
u'QUESTION': ['171', '141', '81'],
u'DOING': ['171', '141'],
u'PENDING': ['171', '141', '81'],
u'TOTEST': ['171', '141', '81'],
u'TODO': ['171', '141', '81'],
u'ABORTED': ['181', '151']
},
}
def get_jira_now_status(pms_url):
jira = JIRA(server='http://127.0.0.1:8080', basic_auth=('user_name', 'password'))
issue_id = pms_url.split("?")[0].split("/")[-1]
issue = jira.issue(issue_id)
pms_status_now = issue.fields.status.name
return pms_status_now
def update_jira_status(pms_url, status_name):
ret = {
"msg": "",
"retcode": 200
}
if "BUG" in pms_url:
ret["msg"] = "BUG暂时不支持修改"
ret["retcode"] = 304
return ret
pms_status_now = get_jira_now_status(pms_url)
if pms_status_now in PMS_STATUS_TRANSITION.keys():
try:
change_info = PMS_STATUS_TRANSITION[pms_status_now]
if status_name in change_info.keys():
jira = JIRA(server='http://127.0.0.1:8080', basic_auth=('user_name', 'password'))
issue_id = pms_url.split("?")[0].split("/")[-1]
issue = jira.issue(issue_id)
change_status = change_info[status_name]
for ch_status in change_status:
jira.transition_issue(issue, ch_status)
ret["msg"] = "更新状态成功"
except Exception as e:
print(e)
ret["retcode"] = 404
ret["msg"] = "更新失败"
return ret