Интеграция Git, Gitlab и Planfix почти как на Github

02.03.2016, 00:49 - 5 мин читать

Распробовал тут на неделе интеграцию задач Github и самого Git issue tracker.

Ниже будет написано, как настроить в Планфиксе такое поведение:

  • В коммите упоминаем задачу, например, Правки футера шаблона, https://test.planfix.ru/task/123456
  • После push в удаленный репозиторий в упомянутой задаче появляется комментарий с текстом коммита и ссылкой на страницу коммита на Gitlab, если проект подключен к репозиторию.

Tl;dr: настраивается post-receive hook в Git на удаленном сервере, после каждого пуша анализируются сообщения пришедших коммитов, коммиты, содержащие ссылки на задачи отправляются в задачи по email.

Вся интеграция делается в одном файле, код хука лежит здесь - git-hook-post-receive

planfix

Здесь надо в 2 словах рассказать о нашем workflow:

  • Компания занимается разработкой и поддержкой около 100 сайтов.
  • Каждый сайт использует Git, репозиторий лежит прямо в корне сайта, bare репозитории отсутствуют.
  • Часто бывают мелкие правки на разных сайтах.
  • 90% сайтов на Drupal 7, в котором половина хранится в базе данных.
  • Во время правки контент-менеджер или клиент могут пользоваться сайтом и менять на нем данные
  • Разработчик выкачивает проект в PhpStorm, настаивает сохранение по Ctrl+S изменений на боевом сайте, таким образом получается, что когда приходит время пушить, на удаленном сервере фактически уже есть все изменения.
  • Разработчик также может напрямую править код сайта на удаленном сервере по SFTP, не выкачивая проект, после чего зайти по SSH на удаленный сервер и сделать коммит прямо оттуда.
  • Git по сути используется не для доставки изменений на боевой сайт, а для их доставки на компы разработчиков и ведения журнала изменений сайта.

Github issues

Кто не знает про issues гитхаба, расскажу вкратце о его фишках:

  • В задачах можно ссылаться на коммиты и другие задачи по номерам, они автоматически становятся ссылками.
  • В коммитах можно ссылаться на задачи так же: #123, такой коммит автоматом упоминается в задаче.
  • В PhpStorm можно смотреть список открытых issues и создавать из них задачи в IDE, что позволяет автоматом создавать чейнджлист, ветку для выполнения задачи, в коммите сразу будет ссылка на задачу (это все по желанию).
  • Можно закрывать задачу прямо из коммита, для этого достаточно упомянуть его рядом с одним из ключевых слов, например, closes #123 после пуша в гитхаб закроет указанную задачу.

А главное, что все связано и из любого места можно перейти на связанные действия.

Я уже краем уха слышал и видел обо всем этом и видел в чужих репозиториях, но вся картина нарисовалась только после использования. Да и к тому же на гитхабе до этого сталкивался только с pull-request'ами, там немного другое поведение.

PhpStorm tasks

В PhpStorm есть интеграция с менеджерами задач, Github там конечно есть, Планфикса там конечно нет, но зато если у менеджера задач есть API, можно интегрировать неподдерживаемый сервис. У Планфикса API есть, но из коробки он не подойдет для этой интеграции, нужно писать свои обертки. В общем-то это дает не много, всего лишь можно будет получать список задач по команде из шторма, и дописывать в коммит ссылку на задачу.

Кстати таски в шторме помогают и без интеграции с трекером: Ctrl+Shift+A - open task, автоматом чистятся все вкладки (создается контекст задачи), создается ветка в гите, changelist, по close task - коммит, я недавно начал пользоваться.

Но гораздо интереснее интеграция в другую сторону: ссылки из задач на коммиты.

Когда я разобрался с тем, как устроена интеграция задач в гитхабе, до меня быстро дошло: просто менеджер задач должен уметь парсить текст коммита, приходящий из гита и делать на основе этого какие-то действия. С этим тоже пока облом: в Планфиксе на данный момент нет обработки писем, прилетающих в задачи, зато есть обработка писем, приходящих на email юзера, что позволяет надеяться на появление обработки писем, приходящих на email задачи. TODO: это есть.

Gitlab

Самые активные проекты мы дублируем на наш внутренний Gitlab. Использование довольно извращенное, Gitlab сейчас никак не участвует в рабочем процессе, являясь просто зеркалом и веб-интерфейсом для просмотра коммитов.

На машине разработчика настраивается pre-push хук, который пушит также в Gitlab:

#!/bin/bash

remote="$1"

if [ "$remote" != "gitlab" ] && [ "$(git remote show | grep -c "gitlab")" = 1 ]; then
        git push gitlab master
fi

Git и Planfix

Никакой готовой интеграции между Git и Планфиксом нет, зато обе системы гибкие и позволяют лепить уникальные решения без больших усилий.

Git поддерживает хуки: скрипты, запускающиеся по определенным событиям.

У каждой задачи в Планфиксе есть свой email адрес, если послать на него письмо, оно придет в задачу в виде комментария, если с email отправителя связан пользователь, то письмо придет как будто от него.

Значит нам нужно отправлять email из Git в Планфикс на адрес задачи.

Настройка входящих в задачу писем

Управление аккаунтом - Работа с помощью e-mail - Правила обработки для задач

Надо создать 2 правила:

  1. Выработка из коммита
  2. Обрезка лишнего текста в коммите

Обязательно в таком порядке!

В правиле выработки:

  • Тема содержит текст @commit
  • Содержание содержит слово time:
  • Добавить аналитику “выработка”: Вид работы:, Дата:, time:, Автор:

В правиле обрезки:

  • Тема содержит текст @commit
  • Удалить все, начиная с метки -+-+-

Связываем всё вместе

Вся интеграция делается в одном файле, код хука лежит здесь - git-hook-post-receive

Чтобы подключить хук, надо положить скрипт в папку .git/hooks/post-receive и сделать его исполняемым, для этого надо выполнить в корне проекта:

curl -s "https://raw.githubusercontent.com/popstas/server-scripts/master/bin/average" > .git/hooks/post-receive
chmod +x .git/hooks/post-receive

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

Хук получает список коммитов, пришедших с последним пушем, находит первую ссылку на задачу Планфикса и отправляет туда письмо.

О письме

  • Отправитель: email того, кто сделал коммит. По этой причине email в git config и email в профиле юзера Планфикса должны совпадать.
  • Получатель: email задачи Планфикса
  • Тема письма: @commit @nonotify, @nonotify для того, чтобы не уведомлять всех участников задачи о коммите, @commit ничего не значит, может быть потом пригодится для поиска таких комментов, хотя в отчетах текст комментария все равно использовать нельзя.
  • Текст письма: текст коммита. Если репозиторий имеет зеркало на Gitlab, то в конец текста будет добавлена ссылка на коммит.

Чтобы хук добавлял ссылку на Gitlab, не придумал ничего лучше, чем добавить remote gitlab:

git remote add gitlab ssh://git@org.ru:10022/sites/test.ru.git

После этого хук будет извлекать из этого адреса URL http://org.ru/sites/test, который является главной страницей репозитория. Сайт при всем при этом не имеет доступа к Gitlab, поэтому push и pull в этот remote работать не будут.