Введение
Исходно в компании, где я работаю, все проекты велись в GitLab. Для сборок проекта, запуска unit-тестов возникла необходимость прикрутить continious integration (CI) систему. Важно уточнить, что разработчики работают под Windows + использую компилятор от VisualStudio.
GitLab уже имеет встроенную систему CI, которая для сборки проектов запускает так называемые runners. Для сборки используются виртуальные контейнеры, запускаемые с помощью Docker. Для Linux есть уже готовые контейнеры и настройка сборки под эту систему не составит труда. В то время как создание Windows-контейнера с настроенным окружение - задача довольно сложная и трудоёмкая.
Поэтому было принято решение не использовать встроенную GitLab-CI, а подключить наиболее популярную на данный момент CI - Jenkins.
Внятных мануалов по настройке совместной работы Jenkins + GitLab я не нашёл, поэтому покопавшись день я решил создать свою инструкцию, которая возможно съекономит кому-то кучу времени и нервов.
Настройка GitLab
Для разграничения доступа необходимо создать в GitLab отдельного пользователя.
Зарегистрируем в GitLab нового пользователя jenkins, дадим ему права доступа к нужному проекту, а затем скопируем Private-token созданного пользователя.
Для этого заходим в Profile Settings -> Account и копируем оттуда свой private-token
Настройка Jenkins
Выбор подходящего плагина
На сегодняшний момент (июль 2016) есть два плагина Jenkins для интеграции GitLab: это GitLab Plugin и Gitlab Merge Request Builder. Второй плагин Gitlab Merge Request Builder у меня после настройки не заработал: он успешно подключался к GitLab, но никак не реагировал на новые megre-requests. Поэтому в данной статье мы рассмотрим настройку GitLab Plugin.
Сразу хотелось бы отметить что плагины имеют похожие настройки, и чтобы не запутаться в том какой конкретно плагин мы настраиваем, лучше удалить из Jenkins плагин Gitlab Merge Request Builder, оставив только GitLab Plugin.
Внимание! Данное руководство описывает настройку GitLab Plugin версии 1.2 и выше. Для более старых версий смотрите прежнюю версию руководства
Установка плагинов
Ставим плагин GitLab Plugin.
Обязательно ставим плагин Plain-credentials. (без него в настройках GitLab Plugin невозможно будет выбрать ни одну учётную запись).
Перезагрузка Jenkins
После установки нужного плагина рекомендуется перезагрузить Jenkins-сервер. Для этого перейдите по адресу http://your-server.ru:8080/restart.
Добавление учётной записи
Заходим в Credentials->System->Global Credentials (unrestricted)->Add Credentials.
В поле Kind выбираем Gitlab Api Token.
В поле "API Token" пишем Api-token пользователя jenkins, которого мы создали на GitLab сервере.
В поле ID пишем любое название, например "jenkins-gitlab"
Настройка Jenkins GitLab Plugin
Заходим в Jenkins->Настроить Jenkins -> Конфигурирование системы. Ищем вкладку Gitlab.
В поле "Connection Name" пишем любое название нашего соединения (их может быть несколько).
В поле "Gitlab host URL" пишем адрес корня нашего GitLab сервера
В поле "Credentials" выбираем единственное доступное там "Gitlab API token"
Нажимаем "Test Connection"
Настройка сборки проекта в Jenkins
Теперь пришло время настроить сборку конкретного проекта. Создадим в Jenkins новый проект. Назовём его, к примеру, MyProject1.
Настройка получения нужной ветки из Git-репозитория
Без этого шага вместо merge-реквестов Jenkins будет собирать ветку master текущего репозитория.
- В разделе "Управление исходным кодом" выбираем Git Repositories и указываем путь к нашему git-репозиторию. Дальше щёлкаем на кнопку дополнительный настроек и выставляем:
Branch Specifier = origin/${gitlabSourceBranch} - В разделе Additional Behaviours нажимаем Add и выбираем Merge before build.
- Задаём Name of repository: origin
- Задаём Branch to merge: ${gitlabTargetBranch}
Пример настроек показан на картинке:
Настройка GitLab Plugin для сборочной задачи
Открываем настройки сборочной задачи.
Находим "GitLab connection". Выбираем там Connection Name, который мы задавали в глобальных настройках
Ищем раздел "Триггеры сборки" и ставим галочку "Build when a change is pushed to GitLab"
Пример настроек показан на картинке:
Копируем "GitLab CI Service URL".
Ставим Hook для новых пул-реквестов в GitLab
Для этого открываем страницу проекта на GitLab.
Заходим в Settings -> Web Hooks и прописываем скопированный на предыдущем шаге адрес "GitLab CI Service URL"
После добавления должна появиться кнопка "Test hook". Нажимаем её и убеждаемся, что в Jenkins запустится сборка нашего проекта MyProject1
Проверка
Для проверки создадим новый мерж-реквест.
Сразу же увидим, что в Jenkins запустилась сборка этого merge-request.
По окончании сборки увидим в GitLab сообщение от Jenkins:
Единственное, действительно упущен момент про ssh ключ.
Был бы благодарен за новую информацию, как к примеру связать это дело с jira, sonarQube, PHPUnit, генерировать документацию PHPDoc, выкладывать сборку на ftp с генерацией домена и т.п.
Веб хуки заработали.
Мало того я написал программу, которая сам создает джобы в Jenkins и вебхуки в gitlab.
Здесь надо заметить, что джоб в Jenkins
это все лишь файл config.xml.