Jenkins 多分支管道扫描而不执行

Jenkins multibranch pipeline Scan without execution

是否可以扫描多分支管道以检测具有 Jenkinsfile 的分支,但不执行管道?

我的项目有不同的分支,当我从父管道多分支启动构建扫描时,我不希望所有带有 Jenkinsfile 的子管道分支开始执行。

在您的 Branch Sources 部分中,您可以添加一个名为 属性 的 Suppress automatic SCM triggering。

这会阻止 Jenkins 使用 Jenkinsfile.

构建所有内容

此外,您可以通过编程方式完成

import jenkins.branch.*
import jenkins.model.Jenkins


for (f in Jenkins.instance.getAllItems(jenkins.branch.MultiBranchProject.class)) {
  if (f.parent instanceof jenkins.branch.OrganizationFolder) {
    continue;
  }
  for (s in f.sources) {
    def prop = new jenkins.branch.NoTriggerBranchProperty();
    def propList = [prop] as jenkins.branch.BranchProperty[];
    def strategy = new jenkins.branch.DefaultBranchPropertyStrategy(propList);
    s.setStrategy(strategy);
  }

  f.computation.run()
}

这是一个可以在 Jenkins 中执行的 Groovy 片段,它会进行扫描,但不会为所有发现的分支启动新的 "builds"。

要添加到@Stqs 的答案,您还可以使用 Job DSL 插件设置 noTriggerBranchProperty 它,例如:

multibranchPipelineJob('example') {
  ...
  branchSources {
    branchSource {
      ...
      strategy {
        defaultBranchPropertyStrategy {
          props {
            // Suppresses the normal SCM commit trigger coming from branch indexing
            noTriggerBranchProperty()
            ...
          }
        }
      }
    }
  }
  ...
}

如果您使用的是 job-dsl,您可以简单地执行此操作,它将扫描所有内容,而不会在您第一次建立索引时实际 运行 构建。

organizationFolder('Some folder name') {
  buildStrategies {
    skipInitialBuildOnFirstBranchIndexing()
  }
}
organizationFolder('my-folder') {

  buildStrategies {
     buildRegularBranches()
     buildChangeRequests {
       ignoreTargetOnlyChanges true
       ignoreUntrustedChanges false
     }
   }
}

注意:需要插件basic-branch-build-strategies

参考资料:

经过多次努力我找到了这个解决方案,它应该只避免在分支索引时触发构建,而不是在提交后禁用自动构建。只需在项目的第一阶段添加它:

when {
    not {
        expression {
            def causes = currentBuild.getBuildCauses()
            String causesClass = causes._class[0]
            return causesClass.contains('BranchIndexingCause')
        }
    }
}