Задача — при создании мерж реквеста(pull request) в Gitlab обновлять задачу в Redmine. Например, обновить описание задачи, добавив ссылку на мерж реквест, или отредактировать любое другое поле. Стандартная интеграция из под коробки Gitlab не позволяла это сделать. Было решено делать это через веб хуки.
Алгоритм работы: после каждого открытия мерж реквеста отправляется событие на кастомный endpoint. Будет отправляться имя ветки из MR, projectCode-issueId-task-description, откуда будет парситься ID задачи Redmine. Пример имени ветки wh-123456-add-webhooks, где 123456 — это ID задачи.
Требования
Аккаунт Gitlab с готовым репозиторием. Пример — https://gitlab.com/Carsak/webhooks-example
Аккаунт Redmine. Для тестов отлично подойдет бесплатный http://www.hostedredmine.com . Для начала работы потребуется лишь зарегистрироваться и настроить обычный проект.
Endpoint — ресурс который обработает событие от Gitlab-a. Для тестов отлично подойдет любой PAAS сервис, далее будет использоваться Heroku.
Подготовка Endpoint
Тут большое поле для фантазии. Как прототип, реомендую склонировать https://gitlab.com/Carsak/webhooks-example и запушить на Heroku.
- Создать или склонировать репозитории из Gitlab
- Установить Heroku Cli
- Создать проект
123heroku apps:create my-awesome-project - Добавить в репозитории ссылку на Heroku
123heroku git:remote --app my-awesome-project - Запустить проект
123git push heroku master - Проект доступен по адресу https://gitlab-webhooks-alma.herokuapp.com/ . На пустой запрос должна быть ошибка
Подготовка Gitlab
Вся подготовка делается на странице Project Settings -> Integrations -> Integration webhooks
- Добавить Endpoint
- Выбрать событие
- Добавить вебхук
Запуск
После создания любого мерж реквеста, например https://gitlab.com/Carsak/webhooks-example/merge_requests/2, запуститься вебхук. Проверить запрос можно на странице Project Settings -> Integrations -> Integration webhooks -> Edit
В результате получаем замечательную картинку обновления задачи
Весь исходный код можно найти по адресу https://gitlab.com/Carsak/webhooks-example