首页 文章

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

提问于
浏览
7

我正试图在Jenkins的Multibranch Pipelines作业中自动触发'Branch Indexing' .

目前,只有一种方法似乎实际工作,即轮询,但我无法做到这一点,无论如何轮询是一个糟糕的解决方案 .

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

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

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

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

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

我想象能够做到以下之一

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

  • 轮询multibranch项目,只构建以前没有构建的分支项目

干杯

3 回答

  • 0

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

    我刚从一个不同的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 ,因此需要注意 .

  • 5

    基于@jjc 's answer, I' ve创建了一个使用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

  • 1

    到目前为止最简单的选择(我知道)是远程告诉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在根上下文( / )下部署了 not ,在这种情况下,URL将是 http://my-jenkins-host/context-path/git/...

相关问题