通过Python使用Jira

wtfpython

  最近,团队准备引入 Jira 做需求管理和任务跟踪。为了能更好地运用 Jira(挖坑),研究了下如何通过 Python 使用 Jira。目前主要是对 issue 进行增删改查操作,例如批量创建 issue,后期还准备将 Jira 的数据定时更新到 Superset 上,生成 Dashboard(或许还有自动生成迭代期报告?)。

0 连接服务器

  首先,连接上部署 Jira 的服务器:

# 导入相关模块
import re
import pandas as pd
from jira import JIRA

jira = JIRA(server='http://127.0.0.1:8080', basic_auth=('user_name', 'password')) 

  连接成功后打印当前用户信息和所有项目:

jira.user(jira.current_user())

<JIRA User: displayName='派 森', key='user_key', name='user_name'>

for j in jira.projects():
    print('{0}-{1}'.format(j, j.name))

TEST-TEST

1 创建 issue

  创建 issue 需要先设置 issue 的字段,然后以字典的形式作为参数传入用到 jira 模块的 create_issue(fields=None, prefetch=True, **fieldargs) 函数:

def createIssue(summary, fix_version, components, assignee, labels, start_date, end_date, project, issuetype, priority, desc=''):
    ''' Create issue
    @param summary: issue summary, str
    @param fix_versions: fix version, str
    @param components: components, list
    @param assignee: assignee, str
    @param labels: labels, list
    @param start_date: plan start date, str
    @param end_date: plan end date, str
    @param project: project name, str
    @param issuetype: issue type name, str
    @param priority: priority
    @param desc: description, str, default ''
    '''
    # 将字符串转换为列表
    labels = re.split(r',|,', re.sub(r'\s*', '', labels))
    components = re.split(r',|,', re.sub(r'\s*', '', components))
    # 将 components 转换为字典列表
    component_list = []
    for component in components:
        component_list.append({'name': component})
            
     issue_dict = {
        'project': {'key': project},              #项目
        'issuetype': {'name': issuetype},         #问题类型
        'priority': {'name': priority},           #优先级
        'summary': summary,                       #问题主题
        'customfield_10303': start_date,          #计划开始时间
        'customfield_10304': end_date,            #计划结束时间
        'fixVersions': [{'name': fix_version}],   #解决版本
        'components': component_list,             #相关模块
        'assignee': {'name': assignee},           #经办人
        'labels': labels,                         #标签
        'description': desc,                      #问题描述
        }
        
     jira.create_issue(issue_dict)
     print('创建成功')

  可以在 notebook 或 shell,通过 input() 逐个输入 issue 所需字段,再通过 createIssue() 创建 issue:

def inputIssue():
    ''' Input issue
    '''
    def defaultInput(msg, default):
        ''' Use default values when input is empty
        @param msg: prompt message, str
        @param default: default value, str
        @return t: result, str
        '''
        t = input(msg)
        if t == '':
            t = default
        return t
    
    def dateInput(raw_date):
        ''' Enter a formatted date string
        @param raw_date: raw date, str
        @return date: format date, str
        '''
        try:
            date = re.search(r'(\d{4}-\d{2}-\d{2})', raw_date).group()
            return date
        except:
            print("输入正确的时间格式(YYYY-MM-DD)")
            dateInput(input("再次输入:"))
    
    project = input("输入项目名称:")
    issuetype = input("输入问题类型:")
    summary = input("输入问题名称:")
    start_date = dateInput(input("输入计划开始时间(YYYY-MM-DD):")) 
    end_date = dateInput(input("输入计划结束时间(YYYY-MM-DD):"))  
    labels = input("输入相关标签(多个以 , 区分):")
    components = input("输入相关模块(多个以 , 区分):")
    fix_version = input("输入解决版本:")
    assignee = input("输入经办人:")
    priority = defaultInput("输入优先级:", '2')
    desc = defaultInput("输入问题描述:", '暂无')
    
    createIssue(summary, fix_version, components, assignee, labels, start_date, end_date, project, issuetype, priority, desc)

  也可以通过 pandasread_csv(),从 CSV 或 Excel 文件中导入数据,批量创建 issue:

df = pd.read_csv('sample.csv', names=['summary', 'fix_version', 'components', 'assignee', 'labels', 'start_date', 'end_date', 'issuetype', 'priority'])
for i in df.index:
    issue = df.loc[i]
    createIssue(issue['summary'], issue['fix_version'], issue['components'], issue['assignee'], issue['labels'], issue['start_date'], issue['end_date'], issue['issuetype'], issue['priority'])

2 删除 issue

  也可以通过 pandasread_csv(),从 CSV 或 Excel 文件中导入数据,批量创建 issue:

def deleteIssue(issue_key):
    ''' Delete issue
    @param issue_key: issue key, str
    '''
    issue = jira.issue(issue_key)
    issue.delete()
    print("删除成功")

3 更新 issue

  在更新 issue 前,需要通过字段 key 获取 issue,然后更新指定字段的内容:

issue = jira.issue('TEST-42')
issue.update(summary='测试用 Python 更新 issue') 

4 查询 issue

  Jira 通过 JQL(JIRA Query Language,Jira 查询语言)进行搜索,语法类似于 SQL。可以通过 JQL 搜索符合条件的 issues,如通过 assignee = currentUser() 查找经办人为当前用户的 issues。

注意:Jira 的 JQL 不同于 Java Query Language

def searchIssues(jql, max_results=100):
    ''' Search issues
    @param jql: JQL, str
    @param max_results: max results, int, default 100
    @return issues: result, list
    '''
    try:
        issues = jira.search_issues(jql, maxResults=max_results)
        return issues
    except Exception as e:
        print(e)

jql = '''
    assignee = currentUser()
'''
issues = searchIssues(jql)

for issue in issues:
    print('{0}: {1}'.format(issue.key, issue.fields.summary))

TEST-42: 测试用 Python 更新 issue
TEST-6: 测试用 Python 新建 issue

  查询 issue 指定字段的内容:

def searchIssueContent(issue, content_type='summary'):
    ''' Search issue content
    @param issue: issue, jira.resources.Issue
    @param content_type: field, str, default 'summary'
    @return result: result, str
    @return result_list: result, list
    '''
    if content_type == 'comments':
        result_list = [c.body for c in jira.comments(issue)]
        return result_list
    elif hasattr(issue.fields, content_type):
        result = getattr(issue.fields, content_type)
        if isinstance(result, list):
            result_list = [c.name for c in result if hasattr(c, 'name')]
            return result_list
        return result

issue = jira.issue('TEST-42')
searchIssueContent(issue, 'comments')

[' !screenshot-1.png|thumbnail! ', '# 测试备注']

5 关于 Jira

  Jira 是一款项目与事务跟踪工具,为敏捷团队的每个成员制定计划、跟踪并发布,被广泛应用于需求收集、项目计划、任务跟踪等领域。由于其功能强大、配置灵活,且具有丰富的扩展插件,可以满足团队在项目管理和开发协作上的大部分需求。

  但由于 Jira 是基于敏捷开发的理念,且拥有复杂的配置和繁多的插件,Jira 的使用门槛较高。当团队决定引入 Jira 时,必须根据团队的特点和项目的需要,进行个性化的配置,并在实际应用的过程中,持续进行调整和优化(这个过程很敏捷==)。

这里吐槽一下 Jira 的使用体验,配置繁琐就罢了,其操作看板和 issue 的体验也不友好(看板用得最舒服的还是 Trello)。


  参考 jira 模块的官方文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容