下面是Jira-API的详细使用的例子,包含:
- Jira的登陆,通过jql批量查询jira-issue,
- 获得jira-project下的所有issue,assignee的详细信息,
- 添加和更新defect
- 下载和上传附件
- 通过Jira登录的cookies搭配requsts库发送自定义的一些http请求
# -*- coding: UTF-8 -*-
import traceback
import requests
from atlassian import Jira
from jira import JIRA
import globalParam
jira = object
jira2 = object
#url是jira的地址
url = "https://www.Jira.com"
# 登录jira,成功为1,失败为0
def login(username, password):
global jira, jira2
result = 2
try:
jira = JIRA(server=url, basic_auth=(username, password), max_retries=1, timeout=400)
jira2 = Jira(url=url, username=username, password=password)
globalParam.reporter = get_current_user()
except Exception:
result = 0
return result
result = 1
return result
# 获得一个项目的所有assignee的信息
def get_all_assignable_users_by_project_key(project_key):
return jira2.get_all_assignable_users_for_project(project_key)
#下载附件到本地
def download_attachment(jira_attachment_id, filepath):
attachment = jira.attachment(jira_attachment_id)
image = attachment.get()
with open(filepath, 'wb') as f:
f.write(image)
#删除Jira上的附件
def delete_attachment(jira_attachment_id):
jira.delete_attachment(jira_attachment_id)
#获得当前登陆的用户名
def get_current_user():
return jira.myself()['displayName']
#获得当前登陆的用户的Key
def get_current_eid():
return jira.myself()['key']
#根据jira-key获得开发人员
# key 可以是key'JIRA-1451'
def get_assignee(self, key):
global jira
issue = jira.issue(key)
return issue.fields.assignee
#获得所有的Jira项目
def get_all_project():
try:
projects = jira.projects()
except Exception:
print(traceback.format_exc())
result = 0
return result
return projects
# 根据jira-project-key参数获得所有的issue的各类信息
def get_issues_by_project_key(project_key):
# 因为component从jira取出来是list,所以用逗号将它分割,重新组合成string
jqlstring = "project = " + project_key + " AND issuetype = Defect ORDER BY updated DESC"
try:
query = jira.search_issues(
jql_str=jqlstring,
json_result=True,
fields="key,summary,description,environment,comment,"
"components,labels,assignee,reporter,status,attachment,updated",
maxResults=4000)
except Exception:
print(traceback.format_exc())
result = 0
return result
issues = query["issues"]
return issues
# 根据jira-project-key参数和时间获得所有的issue的各类信息
def get_issues_by_project_key_and_time(project_key, last_synctime):
# 因为component从jira取出来是list,所以用逗号将它分割,重新组合成string
jqlstring = "project = " + project_key + " AND updatedDate >='" + last_synctime +
"' AND issuetype = Defect ORDER BY updated DESC"
try:
query = jira.search_issues(
jql_str=jqlstring,
json_result=True,
fields="key,summary,description,environment,comment,"
"components,labels,assignee,reporter,status,attachment,updated",
maxResults=4000)
except Exception:
print(traceback.format_exc())
result = 0
return result
issues = query["issues"]
return issues
#根据jira-project-key参数获得所有的component信息
def get_components_by_project_key(project_key):
try:
components = jira.project_components(project_key)
except Exception:
print(traceback.format_exc())
result = 0
return result
return components
#根据jira-project-key参数获得所有的version信息
def get_version_by_project_key(project_key):
jira_project = jira.project(project_key)
versions = jira_project.versions
return versions
#添加一个defect
def add_defect(project_key, summary, description, steps_to_reproduce, labels, defect_severity, env, components,
frequency, product_id, version_name, assignee_eid):
jira_project = jira.project(project_key)
label_list = labels.split(",")
pid = jira_project.id
if isinstance(product_id, int):
product_id = str(product_id)
components_list = []
components_name = components.split(",")
for item in components_name:
components_list.append({"name": item})
issue_dict = {
'project': {'id': pid},
'summary': summary,
'description': description,
'issuetype': {'name': 'Defect'},
'labels': label_list,
'customfield_10040': {"value": defect_severity}, # BUG的Defect Severity字段
'customfield_10033': steps_to_reproduce, # BUG的描述步骤
'environment': env,
'components': components_list,
'customfield_10336': {"value": frequency},
'customfield_13600': product_id,
'customfield_11170': {"name": version_name},
"assignee": {"name": assignee_eid}
}
if assignee_eid is None:
del issue_dict['assignee']
if env == "":
del issue_dict['environment']
if components == "":
del issue_dict['components']
if product_id == "" or product_id == "n":
del issue_dict['customfield_13600']
if version_name == "":
del issue_dict['customfield_11170']
new_issue = jira.create_issue(fields=issue_dict)
return new_issue.key
#更新一个defect
def update_defect(issue_key, summary, description, steps_to_reproduce,
labels, defect_severity, env, components, frequency, product_id, version_name, assignee_eid):
issue = jira.issue(issue_key)
label_list = labels.split(",")
components_list = []
components_name = components.split(",")
if components == "":
pass
for item in components_name:
components_list.append({"name": item})
issue_dict = {
'summary': summary,
'description': description,
'issuetype': {'name': 'Defect'},
'labels': label_list,
'customfield_10040': {"value": defect_severity}, # BUG的Defect Severity字段
'customfield_10033': steps_to_reproduce, # BUG的描述步骤
'environment': env,
'components': components_list,
'customfield_10336': {"value": frequency},
'customfield_13600': str(product_id),
'customfield_11170': {"name": version_name},
"assignee": {"name": assignee_eid}
}
if assignee_eid is None:
del issue_dict['assignee']
if env == "":
del issue_dict['environment']
if components == "":
del issue_dict['components']
if version_name == "":
del issue_dict['customfield_11170']
update_issue = issue.update(fields=issue_dict)
cccc = update_issue
return issue_key
#将一个本地的附件上传到Jira上
def add_attachment(issue, path, filename):
newpath = path.encode('utf-8')
cc = unicode(newpath, "utf-8")
result = jira.add_attachment(issue=issue, attachment=cc, filename=filename)
return result
#根据jira-key获得该issue所有的附件
def get_attachment(issue_key):
issue = jira.issue(issue_key)
return issue.fields.attachment
#通过项目project_key值,抓取页面上的一些自定义参数,例如自定义参数13600,对应products参数
def get_products_by_project_key(project_key):
product_map = {}
jiraproject = jira.project(project_key)
#jira._session.cookies可以用来搭配requests库,发送请求
cookies = jira._session.cookies
body = {"pid": jiraproject.id}
url = "https://www.jira.com/secure/QuickCreateIssue!default.jspa?decorator=none"
result = requests.post(url, data=body, cookies=cookies,
headers={"Content-type": "application/x-www-form-urlencoded"})
html = result.text
try:
select1 = html.split('"id":"customfield_13600","label":"Product/s","required":false,')[1]
select2 = select1.split('</select>')[0]
if not select2.__contains__("\n\tNone\n\n"):
select3 = select2.split('<option')
c = select3
for item in select3:
if item.__contains__('value='):
patern_id = item.split('value=\"')[1]
id = patern_id.split('\"')[0]
patern_value = item.split("\n ")
value = patern_value[1].strip()
product_map[id] = value
except Exception:
# print(traceback.format_exc())
pass
return product_map
#给一个jira-issue添加comment
def add_comment(issue_key, comment_body):
comment = jira.add_comment(issue_key, comment_body)
return comment.id