我正在尝试在Jenkins的Multibranch Pipelines作业中自动触发“分支索引”。
目前,只有一种方法实际上可行,即轮询,但我无法做到这一点,无论如何轮询都是一个糟糕的解决方案。
该插件不支持“远程触发构建(例如,从脚本)”(不保存选项),因此我无法通过推送等Web挂钩触发它。
我尝试在回购中创建'触发'自由式构建,但是'构建后操作 - 构建其他项目'声称Multibranch Pipeline项目不是可构建项目。
如果轮询是我能做到这一点的唯一方法,那么我需要禁用自动SCM触发(否则我们在重新索引时会得到重复的构建)因为我需要在分支项目上启用web钩子触发。
但这不起作用,因为我通过分支项目中的管道脚本设置Web挂钩,并且您需要至少构建一次以使该属性注册。
我已经在圈子里走了一段时间,所以我希望我错过了一些明显的东西,但是任何帮助都会受到赞赏。
我想象能够做到以下其中一个
以某种方式触发多分支项目作为下游项目
轮询multibranch项目,只构建之前尚未构建的分支项目
干杯
答案 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/...