Gitlab Webhook не запускает сборку на Дженкинс

У меня есть группа многоотраслевых конвейерных заданий, сгенерированных с помощью следующего скрипта groovy:

[
      'repo1',
      'repo2',
].each { service ->

  multibranchPipelineJob(service) {

    displayName(service)

    branchSources {
      git {
        remote("[email protected]:whatever/${service}.git")
        credentialsId('gitlab-ssh-key')
      }
    }

    orphanedItemStrategy {
      discardOldItems {
        daysToKeep(0)
        numToKeep(30)
      }
    }

    triggers {
      periodic(5)
    }

  }
}

и в каждом репо Jenkinsfile который выглядит следующим образом:

#!/usr/bin/env groovy

properties([
      gitLabConnection('[email protected]'),
      pipelineTriggers([
            [
                  $class               : 'GitLabPushTrigger',
                  triggerOnPush        : true,
                  triggerOnMergeRequest: true,
            ]
      ]),
      disableConcurrentBuilds(),
      overrideIndexTriggers(false)
])

node {

  def sbtHome = tool name: 'sbt-0.13.15', type: 'org.jvnet.hudson.plugins.SbtPluginBuilder\$SbtInstallation'

  stage('Checkout') {
    checkout scm
  }

  stage('Build') {
    sh "'${sbtHome}/bin/sbt' clean compile"
  }

  stage('Test') {
    sh "'${sbtHome}/bin/sbt' test"
  }

  if (env.BRANCH_NAME == 'develop' || env.BRANCH_NAME == 'master') {
    stage('Publish') {
      sh "'${sbtHome}/bin/sbt' publish"
    }
  }
}

Все работает правильно. Проект seeder генерирует все папки из первого скрипта, и все ветки для данного репо создаются правильно.

К сожалению, у меня проблемы с запуском сборки для любой ветки после коммита + push, сделанного для gitlab.

Я правильно настроил jenkins - я имею в виду плагин gitlab, соединение есть, и все работает хорошо.

Я также добавил webhook на стороне gitlab, и он также работает правильно. После отправки тестового нажатия я получаю 200 OK от jenkins и в журналах вижу, что сканирование веток началось и правильно обнаружил изменения. К сожалению, сборка для измененной ветки не начинается. Вот выдержка из журнала сканирования ветки:

  Checking branch ci
      ‘Jenkinsfile found
    Met criteria
Changes detected: ci (a7b9ae2f930b0b10d52bb42f1ecf96a68bba4a30 → 39a4c1a65051d5e90079feec14ad22455a77c58e)
Did not schedule build for branch: ci

Я на 100% уверен, что это не проблема со связью между моим экземпляром jenkins и учетной записью gitlab. Я вижу, что webhook срабатывает после нажатия на gitlab, я вижу отправку запроса и сканирование ветки. Изменения также обнаружены, но почему работа не началась? Я также внимательно прочитал документы и все настроил правильно.

Jenkins version: 2.150.3
Gitlab version: 11.8.1-ee

РЕДАКТИРОВАТЬ

Кажется, что после обновления jenkins до v.2.164.1 все стало работать правильно.

Ответ 1

Я нашел этот очень полезный пример установки (непрерывная интеграция с Jenkins и GitLab). Особенно часть управления исходным кодом:

Нам нужно указать имя как "происхождение", которое будет использоваться другими разделами. Для Refspec нам нужно ввести: +refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*

А также:

origin/${gitlabSourceBranch} ветки нам нужен origin/${gitlabSourceBranch} который будет заполнен на основе веб-ловушки, которую мы будем настраивать дальше.


Edit1

Вы можете попробовать следующее для одного многоотраслевого конвейера:

  1. Выберите ветку, например ci
  2. Выберите "Просмотр конфигурации"
  3. Под "Построить триггеры" установите флажок "Построить, когда изменения передаются в GitLab"
  4. Внесите некоторые изменения в код и нажмите ci

Edit2

Я не смог найти подходящий git-проект для запуска и попытаться воспроизвести это поведение. Так что, если кто-то знает подобный проект и может поделиться, пожалуйста, прокомментируйте, и я мог бы сделать еще некоторое тестирование.

Для Gitlab (запрашивается пробный ключ, в противном случае это будет GitLab Community Edition):

sudo docker run --detach --hostname gitlab.example.com --publish 443:443 --publish 80:80 --publish 22:22 --name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab --volume /srv/gitlab/logs:/var/log/gitlab --volume /srv/gitlab/data:/var/opt/gitlab gitlab/gitlab-ee:11.8.1-ee.0

Для Дженкинса:

sudo docker run  -u root  --rm  -d  -p 8080:8080  -p 50000:50000  -v jenkins-data:/var/jenkins_home  -v /var/run/docker.sock:/var/run/docker.sock  jenkins/jenkins:2.150.3

Затем " Интеграция " → " Jenkins CI " в Gitlab, как на этом изображении: enter image description here

Надеюсь, это поможет вам!

Ответ 2

Я считаю, что вам нужно использовать includes() чтобы указать шаблоны, определяющие, какие ветки будут включены:

branchSources {
  git {
    remote("[email protected]:whatever/${service}.git")
    credentialsId('gitlab-ssh-key')
    includes('ci')
  }
}

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

includes("master release/* feature/* bugfix/*")

Существует также соответствующая excludes() для еще более детального управления.

Ответ 3

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

Убедитесь, что конфигурация вашей ветки Jenkins охватывает ветки, которые вы тестируете. Также убедитесь, что опция подавления автоматического запуска SCM не установлена.

Обратите внимание, что настройки на уровне организации или папки будут влиять на конкретные настройки проекта и задания, если они не будут специально переопределены на более низком уровне.

Ответ 4

Мы сталкивались с похожими (не одинаковыми) проблемами с gitlab и Jenkins, и проблема была связана с учетными данными.

В Jenkins мы создали новый глобальный токен доступа для GitLab (Конфигурация Jenkins → Учетные данные → Система → Новый глобальный доступ → Определить токен gitlab). Это генерирует токен, который мы добавили в Webhook, теперь ловушка выглядит примерно так:

http://[Gitlab User]:[token ID]@Jenkins Address

Я надеюсь, что это помогает