我可以使用该build命令调用另一个 jenkins 工作。有没有办法让我告诉另一份工作进行分支扫描?
多分支管道作业有一个 UI 按钮“立即扫描存储库”。当您按下此按钮时,它将检查已配置的 SCM 存储库并检测所有分支并为每个分支创建子作业。
我有一个多分支管道作业,我选择了“抑制自动 SCM 触发”选项,因为我只希望它在我从另一个作业调用它时运行。由于选择了此选项,多分支管道不会自动检测何时将新分支添加到存储库。(如果我在 UI 中单击“立即扫描存储库”,它将检测到它们。)
本质上,我有一个多分支管道作业,我想从另一个使用相同 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}"
Run Code Online (Sandbox Code Playgroud)
我在那条build线上得到一个错误,因为目标多分支管道作业还不知道它BRANCH_NAME存在。我需要一种方法来从当前作业触发目标作业中的 SCM 重新扫描。
Ste*_*ing 10
与您自己的想法类似,我可以贡献我的优化,该优化实际上会等到扫描完成(但受脚本安全性的约束):
// 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
}
}
Run Code Online (Sandbox Code Playgroud)
在发布问题后不久就解决了这个问题。调用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}"
Run Code Online (Sandbox Code Playgroud)
这wait: false很重要,否则您会收到“错误:不支持等待非作业项目”。多分支“父”作业比作业更接近文件夹,但它是支持build命令的文件夹,它通过扫描 SCM 来实现。
但是解决这个问题只会导致另一个问题,那就是wait: false我们无法知道 SCM 扫描何时完成。如果您有一个大型存储库(或者您缺少 jenkins 代理),则在第二个build命令由于分支不存在而失败后才会发现该分支。您可以将睡眠时间调得更高,但这不会扩展。
幸运的是,如果您为 jenkins 设置了 github webhooks,则甚至不需要手动启动 SCM 扫描。该分支或多或少会立即被发现,因此就我而言,这是另一种解决方法。我遇到它的原因是我们的 dev jenkins 中没有设置 webhooks,但是一旦我将此代码移动到 prod,它就会正常工作。
如果您尝试使用 JobDSL 来设置调用 multibranches 的 multibranches 并且您没有 webhooks 或类似的东西,更好的方法可能是放弃 multibranch 用于您的第二层作业并使用 JobDSL 创建文件夹并管理分支作业你自己。
| 归档时间: |
|
| 查看次数: |
7701 次 |
| 最近记录: |