Yandex Tracker — аналог Jira, который так же предназначен для совместной работы над проектами и управления процессами внутри компании. Когда мы стали использовать его для внутренних проектов, нам захотелось его немного кастомизировать. Например, сервис не может автоматически перемещать задачи по виртуальной доске, а перемещать их самостоятельно не всегда удобно. Разработчик может запушить коммит и открыть pull request (PR), но затем ему придется зайти в Yandex Tracker и вручную изменить статус задачи.

Одна из команд Evrone, работающая над внутренним ERP-проектом, решила автоматизировать этот процесс. Сразу же появилась идея создать экшен для GitHub Actions, поскольку на данный момент ничего подобного в Github нет. У Yandex Tracker есть API, которому можно отправлять запросы, например, «Перевести задачу в другой статус».

Это и делает Yandex-tracker-action: взаимодействует с Yandex API «за кадром» и перемещает задачу. Теперь при открытии pull request выполняется действие по перемещению задачи. Когда мы принимаем pull request, задача также переходит в статус «Merged».

Как работает Yandex-tracker-action

По умолчанию он парсит коммиты вида «[RI-1] implement something» и извлекает номер задачи (в данном случае — RI-1). Можно ставить задачи непосредственно в экшене, например, указывая вывод предыдущего задания. 

Если в pull request есть несколько коммитов с разными номерами задач, все они будут перемещены на доску. Также можно указать несколько задач в экшене. Будут собраны все ключи задач, как указанные пользователем, так и найденные в коммитах.

Если номер задачи в трекере не найден, вы получите предупреждение, но все найденные задачи будут обработаны. Если задаче некуда перемещаться или она уже имеет нужный статус, будет выведено сообщение об этом.

Базовое использование

По умолчанию будут парситься сообщения коммита типа «[RI-1] awesome-feature», где «RI-1» — идентификатор задачи. Вы можете указать конкретный идентификатор задачи, а также использовать логику предыдущего этапа работы.

name: YC Tracker
on:
  pull_request:
    types:
      - opened
      - reopened
      - synchronize
      - closed

jobs:
 transit-tasks:
    runs-on: ubuntu-latest
    steps:

      - name: Checkout
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Move Task When PR Opened
        if: github.event.action != 'closed'
        uses: evrone-erp/yandex-tracker-action@v1
        with:
          token: ${{secrets.GITHUB_TOKEN}}
          yandex_org_id: ${{ secrets.YANDEX_ORG_ID }}
          yandex_oauth2_token: ${{ secrets.YANDEX_OAUTH2_TOKEN }}
          task_url: true
          ignore: ERP-31,ERP-32

      - name: Move Task When PR Merged
        if: github.event.pull_request.merged == true
        uses: evrone-erp/yandex-tracker-action@v1
        with:
          token: ${{secrets.GITHUB_TOKEN}}
          yandex_org_id: ${{ secrets.YANDEX_ORG_ID }}
          yandex_oauth2_token: ${{ secrets.YANDEX_OAUTH2_TOKEN }}
          task_url: true
          ignore: ERP-31,ERP-32

Добавление конкретного ключа задачи

Можно указать номера задач, разделив их запятыми.

- uses: evrone-erp/yandex-tracker-action@v1
  with:
    token: ${{secrets.GITHUB_TOKEN}}
    yandex_org_id: ${{ secrets.YANDEX_ORG_ID }}
    yandex_oauth2_token: ${{ secrets.YANDEX_OAUTH2_TOKEN }}
    tasks: RI-218 # or RI-218,RI-11

Добавление задач, которые нужно игнорировать

Иногда нужно игнорировать задачи с длинным жизненным циклом. Если есть давно выполняющиеся задачи, которые не должны автоматически перемещаться, то их можно пропускать. Если таких задач несколько, их разделяют запятыми.

- uses: evrone-erp/yandex-tracker-action@v1
  with:
    token: ${{secrets.GITHUB_TOKEN}}
    yandex_org_id: ${{ secrets.YANDEX_ORG_ID }}
    yandex_oauth2_token: ${{ secrets.YANDEX_OAUTH2_TOKEN }}
    ignore: RI-1 # or RI-1,DI-8

Комментирование PR с URL задачи

Если true — к текущему PR будет установлен комментарий с адресом задачи из формы в описании PR.

- uses: evrone-erp/yandex-tracker-action@v1
  with:
    token: ${{secrets.GITHUB_TOKEN}}
    yandex_org_id: ${{ secrets.YANDEX_ORG_ID }}
    yandex_oauth2_token: ${{ secrets.YANDEX_OAUTH2_TOKEN }}
    task_url: true

Получение всех доступных переходов

По умолчанию, если открыт PR, задача перейдет в статус in_review. Если PR принят, статус — resolved. Вы можете указать имя, которое удобно читать, или имя конечной точки.

Получить все доступные состояния:

curl -H "Authorization: OAuth <oauth2-token>" -H "X-Org-ID: <org-id>" -H "Content-Type: application/json" https://api.tracker.yandex.net/v2/issues/<task-key>/transitions | jq ".[].id"

Посмотреть вывод экшена и найти статусы:

- uses: evrone-erp/yandex-tracker-action@v1
  with:
    token: ${{secrets.GITHUB_TOKEN}}
    yandex_org_id: ${{ secrets.YANDEX_ORG_ID }}
    yandex_oauth2_token: ${{ secrets.YANDEX_OAUTH2_TOKEN }}
    to: 'На ревью' # or 'in_review'

Один ход для открытого PR и один ход для принятого

Можно задать разную логику для перемещения задач в момент открытия PR и в момент его принятия. См. выше названия состояний по умолчанию.

- name: Move Task When PR Opened
  if: github.event.action != 'closed'
  uses: evrone-erp/yandex-tracker-action@v1
  with:
    token: ${{secrets.GITHUB_TOKEN}}
    yandex_org_id: ${{ secrets.YANDEX_ORG_ID }}
    yandex_oauth2_token: ${{ secrets.YANDEX_OAUTH2_TOKEN }}
    to: 'in_review'

- name: Move Task When PR Merged
  if: github.event.pull_request.merged == true
  uses: evrone-erp/yandex-tracker-action@v1
  with:
    token: ${{secrets.GITHUB_TOKEN}}
    yandex_org_id: ${{ secrets.YANDEX_ORG_ID }}
    yandex_oauth2_token: ${{ secrets.YANDEX_OAUTH2_TOKEN }}
    to: 'merged'

Планы на будущее

Разработка Yandex-tracker-action началась совсем недавно и пока продолжается. Мы хотим включить в него дополнительные опции, которые могут понадобиться другим компаниям. Поэтому в ближайшем будущем мы собираемся выпустить новый релиз и использовать Yandex-tracker-action в проектах клиентов.

В процессе работы над Yandex-tracker-action мы приобрели ценный опыт и лучше разобрались с тем, как работает Yandex Tracker. Мы поняли, что таким образом можно создавать любые фичи, и теперь надеемся использовать полученные знания для разработки ещё более полезных функций.

Валерий Сиволапенко, DevOps-инженер Evrone.

В каждой компании свои собственные бизнес-процессы, и экшены должны быть адаптированы к тем статусам, которые требуются каждой конкретной команде. Например, когда мы открываем pull request, мы переводим задачу в состояние «На ревью», но в другой компании этот процесс может быть построен иначе, и задачу нужно перевести в другое поле. 

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

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


  1. TimoshkinVlad
    19.08.2022 10:49

    Есть 2 аккаунта для яндекс трекера. Можно ли ярлыком открывать трекер с конкретного акаунта?


    1. coveraver
      19.08.2022 12:57
      +2

      Экшен только формирует ссылку на задачу. Непосредственно аутентификация пользователя не выполняется самим экшеном. То есть, вы попадете в трекер под тем аккаунтом, который залогинен в нем, в текущей сессии браузера. Если же мы говорим об yandex_oauth2_token, то это токен пользователя, из-под которого осуществляется взаимодействие с самой задачей в трекере (комментарий, смена статуса).