Gitlab Webhook不会触发jenkins的构建

时间:2019-03-02 09:13:37

标签: git jenkins groovy gitlab jenkins-pipeline

我有一组使用以下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"
    }
  }
}

一切正常。 seeder 项目从第一个脚本生成所有文件夹,并且正确构建了给定回购的所有分支。

不幸的是,在对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

我100%确信这不是我的jenkins实例与gitlab帐户之间的通信问题。我看到推送到gitlab后触发了Webhook,看到请求正在发送并且分支扫描正在运行。还可以检测到更改,但是为什么地球上的作业还没有开始??我还仔细阅读了docs,并正确配置了所有内容。

Jenkins version: 2.150.3
Gitlab version: 11.8.1-ee

编辑

似乎在将jenkins升级到v.2.164.1之后,它们都开始正常工作。

4 个答案:

答案 0 :(得分:3)

我发现这非常有用Setup ExampleContinuous Integration with Jenkins and GitLab)。尤其是源代码管理部分:

  

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

还有:

  

分支说明符,我们需要origin/${gitlabSourceBranch},它将根据我们接下来要设置的网络挂钩进行填充。


编辑1

您可以对一个多分支管道尝试以下操作:

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

Edit2

我找不到合适的git项目来运行并尝试重现此行为。因此,如果有人知道类似项目并可以分享,请发表评论,我可以进行更多测试。

对于 Gitlab (要求试用密钥,otherwise it will be a 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

对于 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

希望这可以为您提供帮助!

答案 1 :(得分:3)

我相信您需要使用includes()来指定用于标识将包括哪些分支的模式:

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

您可以指定许多模式,其中可以包含通配符。例如:

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

还有一个excludes()用于更细粒度的控制。

答案 2 :(得分:3)

可能您已将Basic Branch Build Strategies配置为仅包括特定分支,例如使用确切名称:master,这将跳过示例中的分支ci

确保您的Jenkins分支构建配置涵盖了要测试的分支。另外,请确保未设置Suppress automatic SCM triggering选项。

请注意,“组织”或“文件夹”级别的设置会影响特定的“项目”和“作业”设置,除非它们在较低级别上被特别覆盖。

答案 3 :(得分:1)

我们在gitlab和Jenkins上遇到了类似(不同)的问题,并且该问题与凭据有关。

在Jenkins中,我们为GitLab创建了一个新的全局访问令牌(Jenkins配置->凭据->系统->新的全局访问->定义gitlab令牌)。生成一个令牌,我们将其添加到Webhook中,现在该钩子类似于:

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

我希望对您有帮助

相关问题