Интеграция git коммитов с Trello с помощью git хуков и Laravel
Всем привет, давненько я не писал ничего интересного. Сегодня я бы хотел рассказать историю интеграции с сервисом Trello подручными средствамии.
Вводные данные
Есть заказчик, с которым в качестве трекера задач мы используем сервис Trello и соответсвенно во всех коммитах у меня добавляются ссылки на карточки из сервиса. Т.е. коммит выглядит следующим образом:
Информация о том, что я сделал в рамках коммитаissue #123 fixed #234
123 и 234 это короткие номера задачи (Выбрал их, потому что их проще воспринимать, хотя уже сейчас подумал, о том, что лучше использовать id карточки (AQ9ZCaOT), т.к. отпадает необходимость искать задачу в списке по короткому ID)
https://trello.com/c/AQ9ZCaOT/123-my-super-task
https://trello.com/c/AQ9ZCaOF/234-my-super-druper-task
Чего хотелось
После некоторого времени я понял, что хочу в коммитах оставлять ссылки на карточки в формате issue #123, а на выходе получать эту же запись в виде ссылки на карточку в trello:
[issue #123](https://trello.com/c/AQ9ZCaOT/123-my-super-task)
a также иметь возможность перемещать задачи по спискам, например:
- fix #123 — Переместить карточку в список Done
- issue #234 — Переместить карточку в список In progress, если она находится в списке New
и в саму карточку добавлять комментарии со сслыкой на коммит.
Git хуки
Ни для кого не открытие, что в git клиенте есть возмоность навешивать хуки на различные события. Про все типы событий можно почитать в документации, в данном случае меня интересовали два типа событий:
- commit-msg — вызываемый после того, как текст коммита был написан и данный текст еще можно отредактировать. В этот момент мы можем получить текст и внести в него изменения.
- post-commit — коммит был совершен и событие просто уведомляет об этом. В этот момент мы можем получить через git log информацию о коммите и произвести синхронизацию с trello.
Создание инструмента
После того, как стало понятно каким образом можно автоматизировать процесс я изучил composer пакеты, которые бы помогли мне решить задачу, но во первых ничего не приглянулось, во вторых всегда хочется сделать что-то новое самому, и, заодно изучить как все это работает изнутри.
Через пару дней удалось создать концепцию своего нового пакета для решения своей задачи. Изначально хотелось инструмент заточенный именно под Laravel с вспомогательными объектами, содержащими полезную информацию в зависимости от типа события.
Что делает этот пакет:
- Для запуска событий используются консольные команды Laravel
- Каждое событие имеет отдельную команду
- На каждое событие можно повесить сколько угодно хуков
- Каждый хук представляет собой отдельный класс или service container
- При вызове хука в него передается необходимая информация (Например объект с текстом коммита, коллекция измененных файлов, лог коммита с хешем, автором и т.д.)
Если пакет покажется интересным пишите в комментарии и я постараюсь отдельно рассказать про него.
Вернемся к нашей задаче.
Trello API client
В трелло есть достаточно подробное API и есть пакеты, которые помогут в работе с ним, для своих целей я выбрал cdaguerre/php-trello-api
Получаем ключ для доступа к API
Сделал для него обертку, которая содержит только необходимые для меня методы
Добавляем конфиги
// config/services.php...
'trello' => [
'api_key' => env('TRELLO_API_KEY'),
'access_token' => env('TRELLO_ACCESS_TOKEN'),
]
...
и .env
TRELLO_BOARD_ID=
TRELLO_API_KEY=
TRELLO_ACCESS_TOKEN=
И регистрация своей обертки в App\Providers\AppServiceProvider
public function register()
{
... $this->app->singleton(Contracts\Client::class, function() {
return new Client(
$this->app['config']['services.trello.api_key'],
$this->app['config']['services.trello.access_token']
);
});
}
Кстати, часто замечаю, что не очень опытные разработчики используют функцию env(…) повсеместно в коде, вне конфигурационных файлов, так вот, обращаю ваше внимание, что, согласно документации, как только вы выполните команду php artisan config:cache, функция env(…) будет возвращать null и ваше приложение перестанет работать. Не стоит так делать!
Создание хуков
Процесс установки пакета я не буду показывать, он описан в документации.
Замена текста на ссылки
Для начала создадим класс хука, который будет заменять текст на ссылки.
И регистрируем хук в конфиге
// config/git_hooks.phpreturn [
...
'commit-msg' => [
Infrastructure\GitHooks\ReplaceIssueNumberIntoLinkToTrello::class => [
'board' => env('TRELLO_BOARD_ID'), // ID доски
],
],
...
];
Для тех, кому мало добавим простой тест
Готово!
Теперь, после очередного коммита будет запущен скрипт и в консоли будет выведена информация об этом
Перемещение задачи в список
Перейдем к перемещению задачи в другой список. Здесь я покажу сокращенный вариант, чтобы код был более понятны.
И регистрируем хук в конфиге
// config/git_hooks.phpreturn [
...
'post-commit' => [
Infrastructure\GitHooks\MoveTrelloCardWhenItFixed::class => [
'board' => env('TRELLO_BOARD_ID'),
'list' => 'DONE', // Название списка куда переносим карточку
],
],
...
];
Ну и тест напоследок
Готово!
Вот собственно и все. Задача не такая сложная и ее конечно же можно было решить без создания пакетов, но так не интересно, всегда хочется под каждую задачу сделать готовый интсрумент, который поможет и другим решить похожие задачи.
Всем спасибо.