Интеграция git коммитов с Trello с помощью git хуков и Laravel

Pavel Buchnev
4 min readFeb 19, 2020

--

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

Что делает этот пакет:

  1. Для запуска событий используются консольные команды Laravel
  2. Каждое событие имеет отдельную команду
  3. На каждое событие можно повесить сколько угодно хуков
  4. Каждый хук представляет собой отдельный класс или service container
  5. При вызове хука в него передается необходимая информация (Например объект с текстом коммита, коллекция измененных файлов, лог коммита с хешем, автором и т.д.)

Если пакет покажется интересным пишите в комментарии и я постараюсь отдельно рассказать про него.

Вернемся к нашей задаче.

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', // Название списка куда переносим карточку
],
],
...
];

Ну и тест напоследок

Готово!

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

Всем спасибо.

--

--

Pavel Buchnev
Pavel Buchnev

Written by Pavel Buchnev

Senior PHP Developer | Contributor to Spiral Framework 🚀 | Enthusiast of RoadRunner & long-running applications | Creator of Buggregator

No responses yet