Gitlab Webhook未能触发Jenkins构建

18

我有一组多分支流水线作业,是使用以下Groovy脚本生成的:

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

  multibranchPipelineJob(service) {

    displayName(service)

    branchSources {
      git {
        remote("git@gitlab.com:whatever/${service}.git")
        credentialsId('gitlab-ssh-key')
      }
    }

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

    triggers {
      periodic(5)
    }

  }
}

在每个存储库中,都有一个如下所示的Jenkinsfile
#!/usr/bin/env groovy

properties([
      gitLabConnection('ci@gitlab.com'),
      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"
    }
  }
}

一切正常。{{播种者}}项目从第一个脚本生成所有文件夹,给定存储库的所有分支都正确构建。
不幸的是,在提交和推送到GitLab后,我无法触发任何分支的构建。
我已经正确配置了Jenkins(指GitLab插件),连接正常,一切都正常。
我还在GitLab侧添加了Webhook,它也正常运行。发送测试推送后,我从Jenkins收到200 OK,并且在日志中看到扫描分支已开始,并且正确检测到更改。不幸的是,更改的分支的构建未启动。以下是分支扫描日志的摘录:
  Checking branch ci
      ‘Jenkinsfile’ found
    Met criteria
Changes detected: ci (a7b9ae2f930b0b10d52bb42f1ecf96a68bba4a30  39a4c1a65051d5e90079feec14ad22455a77c58e)
Did not schedule build for branch: ci

我可以肯定这不是我的Jenkins实例和GitLab账户之间通信的问题。我看到在推送到GitLab后触发了Webhook,我看到请求被发送并运行了分支扫描。变更也被检测到,但是为什么任务没有启动呢?我还仔细阅读了文档并正确地进行了配置。
Jenkins version: 2.150.3
Gitlab version: 11.8.1-ee

编辑

似乎将Jenkins升级到v.2.164.1之后,一切都开始正常工作了。


你在Jenkins中使用的Gitlab插件版本是多少?在jenkins版本为2.1.60、gitlab插件版本为1.5.11和gitlab版本为11.6.3-ce的情况下,你的DSL可以创建多分支作业,并在推送时构建分支。尝试使用Open Blue Ocean插件之一创建仓库,看看会发生什么。顺便检查一下https://dev59.com/4azka4cB1Zd3GeqP5j8x。看起来插件还不支持合并请求事件。 - Carlos Cavero
有一个开放的MR允许多分支管道的MR https://github.com/jenkinsci/gitlab-plugin/pull/857 - Carlos Cavero
你能分享一下你的GitLab webhook吗? - Carlos Cavero
4个回答

4
我发现这个非常有用的设置示例 (使用Jenkins和GitLab实现持续集成)。特别是“源代码管理”部分:

我们需要将名称指定为“origin”,这将被其他部分使用。对于Refspec,我们需要输入:+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*

还有:

我们需要使用 origin/${gitlabSourceBranch} 作为分支规范,这将根据我们接下来要设置的web hook 填充。


编辑1

您可以尝试以下内容用于一种多分支管道:

  1. 选择一个分支,例如ci
  2. 选择“查看配置”
  3. 在“构建触发器”下选择复选框“在将更改推送到GitLab时构建”
  4. 对代码进行一些更改并将其推送到ci

编辑2

我找不到一个合适的git项目来运行和尝试复制这种行为。因此,如果有人知道一个类似的项目并愿意分享,请评论,我可以进行更多测试。

对于GitLab(请求试用密钥,否则将使用GitLab社区版):

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

对于Jenkins

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

接下来是在Gitlab中的"集成" —> "Jenkins CI",如此图片所示:enter image description here 希望这能对您有所帮助!

很遗憾,没有“源代码管理”部分 - 它是通过任何插件添加的吗? - Opal
@Opal 已编辑过这篇帖子,您能试一下吗? - Anton Bärwald
不确定我是否有时间,但会尝试。 - Opal
实际上完全不是。全部都在私有仓库中。 - Opal
@Opal 理解。我编辑了帖子并尝试了一些方法,希望对下一个解决此问题的人有所帮助。 - Anton Bärwald
显示剩余2条评论

3
可能您已经配置了基本分支构建策略,只包括特定的分支,例如使用精确名称:master,这将跳过您示例中的分支ci
请确保您的Jenkins分支构建配置涵盖您正在测试的分支。还要确保未设置抑制自动SCM触发选项。
请注意,组织或文件夹级别的设置将影响特定项目和作业设置,除非它们在较低级别上被明确覆盖。

如何进行检查? - Opal
@Opal 请尝试前往作业配置页面。如果设置不在那里(SCM 部分?),请检查包含的项目、文件夹、组织和系统选项,因为它们可能会继承配置。 - Karol Dowbecki
我没有安装“基本分支构建策略”插件 - 是否需要安装它? - Opal
我已经安装了“基本分支构建策略”,并添加了“构建策略:常规分支”,但没有效果。还有其他想法吗? - Opal
@Opal,你可以尝试按照这个答案定义一个没有计划的空触发器来为你的工作流程做准备,然后将其推送到分支上。 - Karol Dowbecki
没有这样的选项。 - Opal

3

我相信你需要使用includes()来指定识别哪些分支将被包含的模式:

branchSources {
  git {
    remote("git@gitlab.com:whatever/${service}.git")
    credentialsId('gitlab-ssh-key')
    includes('ci')
  }
}

您可以指定多个模式,这些模式可以包含通配符。例如:

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

还有一个对应的excludes()函数,用于更精细地控制。


我曾经使用过includes('*'),但是完全没有帮助。 - Opal

1
我们在使用Gitlab和Jenkins时遇到了类似(但不完全相同)的问题,与凭据有关。在Jenkins中,我们为GitLab创建了一个新的全局访问令牌(Jenkins配置->凭据->系统->新建全局访问->定义GitLab令牌)。这将生成一个令牌,我们将其添加到Webhook中,现在Webhook看起来像这样:
http://[Gitlab User]:[token ID]@Jenkins Address

我希望它有所帮助


谢谢,但我怀疑令牌的缺失是否导致了我的失败。身份验证完全没有问题。 - Opal
1
就像我说的,在类似情况下它对我们起作用了(分支被索引但未触发构建且未显示认证问题)。没有其他提示,抱歉。 - Jose Camacho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接