在多分支管道上触发分支索引(Jenkins / Git)

时间:2017-01-10 22:02:10

标签: jenkins jenkins-pipeline multibranch-pipeline

我正在尝试在Jenkins的Multibranch Pipelines作业中自动触发“分支索引”。

目前,只有一种方法实际上可行,即轮询,但我无法做到这一点,无论如何轮询都是一个糟糕的解决方案。

该插件不支持“远程触发构建(例如,从脚本)”(不保存选项),因此我无法通过推送等Web挂钩触发它。

我尝试在回购中创建'触发'自由式构建,但是'构建后操作 - 构建其他项目'声称Multibranch Pipeline项目不是可构建项目。

如果轮询是我能做到这一点的唯一方法,那么我需要禁用自动SCM触发(否则我们在重新索引时会得到重复的构建)因为我需要在分支项目上启用web钩子触发。

但这不起作用,因为我通过分支项目中的管道脚本设置Web挂钩,并且您需要至少构建一次以使该属性注册。

我已经在圈子里走了一段时间,所以我希望我错过了一些明显的东西,但是任何帮助都会受到赞赏。

我想象能够做到以下其中一个

  • 以某种方式触发多分支项目作为下游项目

  • 轮询multibranch项目,只构建之前尚未构建的分支项目

干杯

3 个答案:

答案 0 :(得分:6)

方法ComputedFolder.scheduleBuild()可以从groovy脚本中调用。

我刚从一个不同的multibranch管道项目中的groovy代码触发了一个multibranch管道项目中的分支索引,然后触发该项目中的下游构建。

代码如下:

@NonCPS
void scanRepo(String downStreamProjectName) {
    Jenkins.instance.getItemByFullName(downStreamProjectName).scheduleBuild()
}
...
String downStreamProject = 'my-folder/my-multibranch-project'
String downStreamJob = "${downStreamProject}/${env.BRANCH_NAME}"
if (Jenkins.instance.getItemByFullName(downStreamJob) == null) {
    scanRepo(downStreamProject)
    while (Jenkins.instance.getItemByFullName(downStreamJob) == null) {
        sleep(1)
    }
}
build([job: downStreamJob, wait: false, quietPeriod: 0])

请注意,Jenkins.instance.getItemByFullName(downStreamProjectName)WorkflowMultiBranchProject,而不是Serializable,因此需要注意。

答案 1 :(得分:1)

根据@jjc的答案,我还使用build步骤创建了一个版本,用于触发扫描:

String downStreamProject = 'my-folder/my-multibranch-project'
String downStreamJob = "${downStreamProject}/${env.BRANCH_NAME}"
if (Jenkins.instance.getItemByFullName(downStreamJob) == null) {
    // we would need "wait: true", which is not possible as of now
    // https://github.com/jenkinsci/pipeline-build-step-plugin/blob/3ff14391fe27c8ee9ccea9ba1977131fe3b26dbe/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L66
    build job: downStreamProject, wait: false
    // continue only once the expected job appears
    while (Jenkins.instance.getItemByFullName(downStreamJob) == null) {
        sleep(1)
    }
}
build downStreamJob

这需要批准以下签名:

  • method jenkins.model.Jenkins getItemByFullName java.lang.String
  • staticMethod jenkins.model.Jenkins getInstance

答案 2 :(得分:0)

到目前为止最简单的选择(我知道)是远程告诉Jenkins Git插件,对定义的存储库有一个新的提交。但是,这不会触发詹金斯立即开始工作。会发生什么是Git插件启动(重新)索引特定的存储库。如果检测到更改,则启动Jenkins作业。

从您的存储库(GitHub,GitLab等)中,您应该触发以下URL:

http://my-jenkins-host/git/notifyCommit?url=git@gitlab.example.com:group/repository.git&delay=0sec

url的值必须与您在Jenkins作业(Git插件)中配置的SCM URL相匹配!

问:可能是你的Jenkins在根上下文(/)下部署了,在这种情况下,网址将是http://my-jenkins-host/context-path/git/...

相关问题