Всем привет. Появилась мысль автоматизировать выгрузку отчетов из Jira. Так как любимым инструментом был Python, выбор пал на модуль от JIra позволяющий работать с их API. Кому интересно прошу по кат.

image

У atlassian есть официальная документация по использованию их модуля. Сам модуль так и называется «jira». По традиции выполним установку модуля командой:

pip install jira

Затем импортируем модуль непосредственно в коде:

from jira import JIRA

Для того чтобы подключиться к самому серверу, необходимо создать клиент передав в него требуемые параметры:

jira_options = {'server': 'https://project-name.atlassian.net'}
jira = JIRA(options=jira_options, basic_auth=(login, api_key))

Для того чтобы пройти авторизацию по паролю, вместо api key можно передать пароль. После того как авторизация пройдена, мы имеем активный api client к которому можно обращаться.

Возможности конечно не безграничны, но достаточно широкие. Мне было необходимо вытаскивать задачи за определенную неделю и составлять отчет по потраченным часам в Excell. Вытаскивать задачи можно непосредственно по самому проекту, по номеру задачи, так и по JQL запросу. Инструменты поиска достаточно гибкие и простые. Вся информация возвращаемая апи клиентом приходит в string, поэтому для работы с ней требуются дополнительные действия.
Составляем jql запрос и забираем по нему задачи:

jql = 'project = ' + project_key + ' AND  worklogDate >= ' + work_date
issues_list = jira.search_issues(jql) 

К сожалению я так и не понял почему в тех задачах которые получаются через такой запрос нет свойства worklog. После некоторых попыток понять что же не так, я вежливо попросил у jira задачу по номеру:

issue = jira.issue(issue_key)

В задаче возвращенной по такому методу поле worklog со списком worklog-ов было. В результате чего я стал брать задачи по jql запросу, вытаскивал номера задачи и уже после вытаскивал необходимую мне информацию:

worklogs = issue.fields.worklog.worklogs

Подобная строка позволяет вытащить все записи о времени от определенной задачи. У каждой из записи есть информация о времени как в секундах так и в текстовом представлении (1h, 3d etc).
Дальше все просто, берем отбрасываем записи, которые не подходят по периоду, в моем случае не совпадает номер недели:

worklog_date_str = re.search(r'(\d{4}-\d{2}-\d{2})', worklog.started)
            worklog_date = datetime.strptime(worklog_date_str.group(0), '%Y-%m-%d')
            if worklog_date.isocalendar()[1] == weak_number:

Так как дата возвращается в строке, я воспользовался простым регулярным выражением, чтобы забирать его, а в следующей строке привожу уже необходимый тип. Выражение worklog_date.isocalendar()[1] позволяет узнать номер недели, который будет сравниваться с тем что необходимо забирать. Если он совпадает, топаем дальше и записываем остальные данные.

В целом вышеприведенный модуль позволяет решать достаточно широкий круг задач, нужно лишь время и желание.

UPD

Можно не запрашивать задачи повторно, а просто экспандить нужное поле
github.com/pycontribs/jira/blob/master/jira/client.py#L2371
спасибо HSerg

Комментарии (6)


  1. massmedium
    28.02.2019 18:14

    >К сожалению я так и не понял почему в тех задачах которые получаются через такой запрос нет свойства worklog. После некоторых попыток понять что же не так, я вежливо попросил у jira задачу по номеру
    экспандить расширенные поля надо.


    1. TIMOHIUS Автор
      28.02.2019 18:15

      Не подскажите, каким образом можно это делать?


      1. HSerg
        01.03.2019 01:10

        1. TIMOHIUS Автор
          01.03.2019 09:47

          Если таким запросом, то да. Но вот именно в документации API я этого не нашел.


          1. HSerg
            01.03.2019 13:38

            Держите — https://github.com/pycontribs/jira/blob/master/jira/client.py#L2371


            P.S. Правильнее таки говорить про JIRA Python Library от сообщества для упрощения работы с официальным JIRA REST API от Atlassian.


            1. TIMOHIUS Автор
              01.03.2019 15:42

              Спасибо, дельное замечние. Поставил бы плюс, да кармы не хватает =)