Автоматизация работы с Jira на Python
6 июля 2020
Недавно по работе я занимался проработкой небольшой tech story. Сторя распалась на несколько задач, связанных отношением «задача А блокирует задачу Б». Стало интересно, как это будет смотреться на диаграмме Ганта, или хотя бы в виде простого графа. Но оказалось, что из коробки Jira такой возможности не предоставляет. Опрос знакомых на предмет готового решения результатов не дал. Тогда было решено написать небольшой скрипт на Python.
Как обычно, зависимости были положены в virtualenv. Зависимостей у скрипта не много:
Пакет jira нужен непосредственно для хождения в Jira API. PyYAML используется для парсинга файла конфигурации. Вот его пример:
url: https://company.atlassian.net
login: user.name@example.com
password: PasswordOrAPIKeyHere
API Key можно получить в Jira, зайдя в свой профиль.
А вот и код скрипта:
# vim: set ai et ts=4 sw=4:
from jira import JIRA
import argparse
import yaml
import os
def load_config(fname):
with open(fname, 'r') as stream:
return yaml.load(stream, Loader=yaml.FullLoader)
parser = argparse.ArgumentParser(
description='Print Graphviz source of dependency graph'+
' for a given tech story'
)
parser.add_argument(
'-c', '--config', metavar='F', type=str,
default=os.environ['HOME']+"/.jira.yaml",
help='config file, by default: ~/.jira.yaml')
parser.add_argument(
'-s', '--story', metavar='S', type=str, required=True,
help='story key')
args = parser.parse_args()
conf = load_config(args.config)
opts = {'server': conf['jira']['url'] }
auth = (conf['jira']['login'], conf['jira']['password'])
jira = JIRA(options=opts, basic_auth=auth)
story = jira.issue(args.story)
print("digraph Gantt {")
print("node [shape=record style=filled fillcolor=yellow "+
"fontname=Arial];")
for link in story.fields.issuelinks:
if link.type.name != 'Contains':
continue
issue = jira.issue(link.outwardIssue.key)
blocks = []
print(""""{}" [label="{}: {}"]""".format(
issue.key, issue.key, issue.fields.summary))
for x in issue.fields.issuelinks:
if x.type.name != 'Blocks':
continue
if 'outwardIssue' not in x.raw.keys():
continue
blocks += [ x.outwardIssue.key ]
for b in blocks:
print('"{}" -> "{}"'.format(issue.key, b))
print("}")
Поначалу я хотел рисовать диаграмму Ганта при помощи PlantUML. Оказалось, что PlantUML рисует скверные диаграммы Ганта. В итоге был использован Graphviz.
Пример использования скрипта:
dot deps.gv -Tpng -o deps.png
open deps.png
А так выглядит результат (кликабельно):
Само собой разумеется, с тем же подходом можно не только строить графы зависимостей. Например, можно взять Matplotlib и построить графики открытых и закрытых багов за спринт. Кроме того, Jira API позволяет создавать и изменять задачи, оставлять комментарии к ним, и так далее.
Метки: Python, Разработка.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.