Popstas

Записки о Linux

2 Mar 2016, 00:49 - 5 мин читать

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

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

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

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

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

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

Здесь надо в 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 задачи.

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 в Планфикс на адрес задачи.

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

Вся интеграция делается в одном файле, код хука лежит здесь - 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 работать не будут.