Распробовал тут на неделе интеграцию задач 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 задачи. 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 правила:
- Выработка из коммита
- Обрезка лишнего текста в коммите
Обязательно в таком порядке!
В правиле выработки:
- Тема содержит текст
@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 работать не будут.