GitLab и JenkinsВведение

Исходно в компании, где я работаю, все проекты велись в 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

GitLab Private token для Jenkins

 

Настройка 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 credentials

Настройка Jenkins GitLab Plugin

Заходим в Jenkins->Настроить Jenkins -> Конфигурирование системы. Ищем вкладку Gitlab.

В поле "Connection Name" пишем любое название нашего соединения (их может быть несколько).

В поле "Gitlab host URL" пишем адрес корня нашего GitLab сервера

В поле "Credentials" выбираем единственное доступное там "Gitlab API token"

Настройки Jenkins Gitlab Плагина

 

Нажимаем "Test Connection"

Настройка сборки проекта в Jenkins

Теперь пришло время настроить сборку конкретного проекта. Создадим в Jenkins новый проект. Назовём его, к примеру, MyProject1.

Настройка получения нужной ветки из Git-репозитория

Без этого шага вместо merge-реквестов Jenkins будет собирать ветку master текущего репозитория.

  1. В разделе "Управление исходным кодом" выбираем Git Repositories и указываем путь к нашему git-репозиторию. Дальше щёлкаем на кнопку дополнительный настроек и выставляем:
    Branch Specifier = origin/${gitlabSourceBranch}
  2. В разделе Additional Behaviours нажимаем Add и выбираем Merge before build.
  3. Задаём Name of repository: origin
  4. Задаём Branch to merge: ${gitlabTargetBranch}

 Пример настроек показан на картинке:

Настройки git-репозитория для Jenkins Gitlab Plugin

Настройка GitLab Plugin для сборочной задачи

Открываем настройки сборочной задачи.
Находим "GitLab connection". Выбираем там Connection Name, который мы задавали в глобальных настройках

Ищем раздел "Триггеры сборки" и ставим галочку "Build when a change is pushed to GitLab"

Пример настроек показан на картинке:

Jenkins настройки плагина для сборки GitLab plugin

 

Копируем "GitLab CI Service URL".

Ставим Hook для новых пул-реквестов в GitLab

Для этого открываем страницу проекта на GitLab.

Заходим в Settings -> Web Hooks и прописываем скопированный на предыдущем шаге адрес "GitLab CI Service URL"

 GitLab Web hooks для Jenkins

 

После добавления должна появиться кнопка "Test hook". Нажимаем её и убеждаемся, что в Jenkins запустится сборка нашего проекта MyProject1

Проверка

Для проверки создадим новый мерж-реквест.

Сразу же увидим, что в Jenkins запустилась сборка этого merge-request.

По окончании сборки увидим в GitLab сообщение от Jenkins:
GitLab результаты успешной сборки Jenkins

 

Комментарии  

0 #3 Николай Мишин 23.11.2016 08:14
Спасибо за такую хорошую статью.
Веб хуки заработали.
Мало того я написал программу, которая сам создает джобы в Jenkins и вебхуки в gitlab.
Здесь надо заметить, что джоб в Jenkins
это все лишь файл config.xml.
0 #2 Radislav Gorbachev 01.09.2016 12:15
Оффтоп но может кто подскажет как организовать в связке gitlab + jenkins автоматическое создание задач сборки при появлении в gitlab группе, репозитория с Jenkinsfile, судя по тому что валяется в интернетах, в старых версиях gitlab был сервис Jenkins CI а в женьке был (есть) плагин Gitlab Hook Plugin (Не путать с Gitlab Plugin) и настраивалось все это установкой в Gitlab сервисе Jenkins CI флага Multi-project setup enabled по скольку данного сервиса в Gitlab нет этого флага. Как решить проблему? Просто хочется автоматизироват ь процесс создания задач сборки в Jenkins.
+1 #1 frodox 15.07.2016 15:34
Вы не описали очень важный шаг - как у Вас на шаге "Настройка получения нужной ветки из Git-репозитория " на первой картинке в поле "Credentials" появилось jenkins! А тут надо целый квест выполнить - создать на машине в пользователе jenkins ssh-ключ, добавить его на gitlab в пользователя, добавить его в ещё один credentials...

Добавить комментарий


Защитный код
Обновить

Рейтинг@Mail.ru Rambler's Top100 Рейтинг@Mail.ru