10

我正在尝试在 Jenkins 的多分支管道作业上自动触发“分支索引”。

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

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

我尝试在 repo 上创建一个“触发”自由式构建,但“构建后操作 - 构建其他项目”声称 Multibranch Pipeline 项目不是可构建项目。

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

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

我一直在兜圈子,所以希望我只是错过了一些明显的东西,但任何帮助将不胜感激。

我想象能够执行以下操作之一

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

  • 轮询多分支项目,只构建之前没有构建的分支项目

干杯

4

3 回答 3

9

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

我刚刚从另一个多分支管道项目中的常规代码触发了一个多分支管道项目中的分支索引,然后触发了该项目中的下游构建。

代码类似于:

@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])

请注意 that Jenkins.instance.getItemByFullName(downStreamProjectName)is WorkflowMultiBranchProjectwhich is not Serializable,因此需要注意。

于 2017-03-31T23:41:02.247 回答
3

根据@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
于 2017-12-04T09:06:00.893 回答
0

到目前为止(我知道)最简单的选择是远程告诉 Jenkins Git 插件有一个已定义存储库的新提交。但是,这不会触发 Jenkins 立即开始工作。发生的情况是 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部署在根上下文 ( /) 下,在这种情况下 URL 将是http://my-jenkins-host/context-path/git/...

于 2018-01-26T07:24:13.123 回答