我可以使用build
命令来调用另一个詹金斯职位。有什么办法可以告诉其他工作进行分支扫描吗?
多分支管道作业具有UI按钮“立即扫描存储库”。当您按下该按钮时,它将签出已配置的SCM存储库,并检测所有分支并为每个分支创建子作业。
我有一个多分支管道作业,因此我选择了“抑制自动SCM触发”选项,因为我只希望它在从另一个作业中调用时才运行。因为选择了此选项,所以多分支管道不会自动检测何时将新分支添加到存储库。 (如果在用户界面中单击“立即扫描存储库”,它将检测到它们。)
基本上,我有一个多分支管道作业,我想从另一个使用相同git存储库的多分支管道作业中调用它。
node {
if(env.BRANCH_NAME == "the-branch-I-want" && other_criteria) {
//scanScm "../my-other-multibranch-job" <--- scanScm is a fake command I made up
build "../my-other-multibranch-job/${env.BRANCH_NAME}"
在该build
行上出现错误,因为目标多分支管道作业尚不知道BRANCH_NAME
存在。我需要一种从当前作业中触发目标作业中的SCM重新扫描的方法。
答案 0 :(得分:1)
与您自己想出的类似,我可以贡献我的优化,实际上要等到扫描完成(但受脚本安全性的约束):
// Helper functions to trigger branch indexing for a certain multibranch project.
// The permissions that this needs are pretty evil.. but there's currently no other choice
//
// Required permissions:
// - method jenkins.model.Jenkins getItemByFullName java.lang.String
// - staticMethod jenkins.model.Jenkins getInstance
//
// See:
// https://github.com/jenkinsci/pipeline-build-step-plugin/blob/3ff14391fe27c8ee9ccea9ba1977131fe3b26dbe/src/main/java/org/jenkinsci/plugins/workflow/support/steps/build/BuildTriggerStepExecution.java#L66
// https://stackoverflow.com/questions/41579229/triggering-branch-indexing-on-multibranch-pipelines-jenkins-git
void scanMultiBranchAndWaitForJob(String multibranchProject, String branch) {
String job = "${multibranchProject}/${branch}"
// the `build` step does not support waiting for branch indexing (ComputedFolder job type),
// so we need some black magic to poll and wait until the expected job appears
build job: multibranchProject, wait: false
echo "Waiting for job '${job}' to appear..."
while (Jenkins.instance.getItemByFullName(job) == null || Jenkins.instance.getItemByFullName(job).isDisabled()) {
sleep 3
}
}
答案 1 :(得分:0)
在发布问题后不久就解决了这个问题。针对基本多分支管道作业而不是分支调用build
会使它重新扫描。我上面的代码片段的解决方案最终看起来像是...
node {
if(env.BRANCH_NAME == "the-branch-I-want" && other_criteria) {
build job: "../my-other-multibranch-job", wait: false, propagate: false // scan for branches
sleep 2 // scanning takes time
build "../my-other-multibranch-job/${env.BRANCH_NAME}"
wait: false
很重要,因为否则您会收到“错误:不支持等待非工作项目”。多分支“父”作业比作业更靠近文件夹,但是它是支持build
命令的文件夹,并且可以通过扫描SCM来实现。
但是解决这个问题只会导致另一个问题,那就是使用wait: false
,我们无法知道SCM扫描何时完成。如果您的存储库很大(或者缺少jenkins代理),则由于分支不存在,直到第二条build
命令失败后,分支才会被发现。您可以将睡眠时间提高得更高,但这并不能扩展。
幸运的是,事实证明,如果您为詹金斯设置了github webhooks,则甚至不需要手动启动SCM扫描。分支或多或少会立即被发现,因此出于我的目的,这是另一种解决方法。我碰到它的原因是我们的开发詹金斯中没有设置webhooks,但是一旦我将此代码移到产品中,它将正常工作。
如果您尝试使用JobDSL来设置调用多分支的多分支,并且没有Webhook或类似的东西,那么更好的方法可能是放弃第二层工作的多分支,并使用JobDSL创建文件夹和管理分支机构自己工作。