You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins多分支管道首次运行缺失参数的解决方案咨询

问题背景

我通过job-dsl插件(实际是将YAML文件转换为Groovy代码)定义了多个多分支管道(multibranch pipelines),每个管道执行时都需要布尔型和字符串型参数。当前这些参数定义在声明式管道的Jenkinsfile中,导致每个分支首次运行前Jenkins无法识别参数,GUI中无“带参数构建”按钮,且从其他构建触发带参构建会失败。新分支创建后需手动触发所有管道,首次构建均会失败。

该问题在Jenkins官方已有多年未解决的公开Issue,故不指望官方修复,寻求可行规避方案。

尝试过的无效方案

我尝试了两种方案但均不理想:

  • 配置Jenkins在新分支创建时自动触发首次构建,虽会失败但能读取Jenkinsfile更新参数。但此方案会产生大量失败邮件和红色构建记录,且部分管道由其他管道触发,无法仅首次运行而不触发后续所有提交的构建。
  • 在job-dsl中传递参数信息(替代或补充Jenkinsfile中的定义)。这在普通管道作业中可行,但不清楚如何(或是否能)在多分支管道中实现。
最小复现示例(MRE)

Jenkinsfile

至少两个多分支管道(MBP)的Jenkinsfile示例如下:

pipeline {
    agent any
    parameters {
        string description: 'Product version', name: 'product_version', trim: true
        booleanParam description: 'Force trigger of downstream pipeline', name: 'force_downstream_trigger' // default: false
    }
    stages {
       stage ('Validate Parameters') {
            when {
                expression { return params.product_version?.isEmpty() }
            }
            steps {
                error 'Parameter "product_version" is empty'
            }
        }
        stage ('do stuff') {
            steps {
                // ...
            }
        }
        stage ('Trigger another pipe') {
            when {
                anyOf {
                    branch comparator: 'REGEXP', pattern: 'master'
                    expression { params.force_downstream_trigger }
                }
            }
                        steps {
                            build wait: false, job: "job2",
                                parameters: [
                                    string(name: 'product_version', value: product_version)
                                ]
                        }
        }
        
    }
}

job-dsl配置

这些管道由job-dsl插件通过种子作业生成,相关配置如下:

jobs.yaml

defaults: &defaults
  credentials: gitlab_srv_acc
  filter_branch_regex: ^master$
  trigger_branch_regex: 
  fetch_tags: false
  run_for_mrs: true
  origin_merge_request_strategy: merge_with_target
  jenkinsfile_path: Jenkinsfile
  
jobs:
    job1: 
        <<: *defaults
        description: first one
    
    job2: 
        <<: *defaults
        description : second one

jobs.groovy

@Grab('org.yaml:snakeyaml:2.2')
import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.Yaml

def dl_parse_yaml(filename) {
    LoaderOptions options = new LoaderOptions()
    options.setMaxAliasesForCollections(100)
    Yaml yaml_parser = new Yaml(options)
    return yaml_parser.load(readFileFromWorkspace(filename))
}

def config = dl_parse_yaml("${WORKSPACE}/jenkins/jobs/universal_docking/hsw_multibranch.yaml")

config.jobs.each { job_name, job_props ->
    multibranchPipelineJob(job_name){
        displayName(job_name)
        description(job_props.description)
        factory{
            workflowBranchProjectFactory{
                scriptPath(job_props.jenkinsfile_path)
            }
        }
        branchSources{
            branchSource{
                source{
                    gitLabSCMSource {
                        id("${job_name}")
                        serverName('my gitlab url')
                        projectOwner('owner')
                        projectPath('group/project')
                        credentialsId('gitlab_acc')
                        traits{                            
                            gitLabBranchDiscovery{
                                strategyId(3) // discover all branches
                            }
                            if (job_props.run_for_mrs) {
                                originMergeRequestDiscoveryTrait {
                                    def merge_request_discovery_strategy = [
                                        "merge_with_target": 1,
                                        "build_mr_head": 2,
                                        "build_both_target_merge_and_head": 3
                                    ]
                                    strategyId(merge_request_discovery_strategy[job_props.origin_merge_request_strategy])
                                }
                            }
                            pruneStaleBranchTrait()
                            pruneStaleTagTrait()
                            headRegexFilter {
                                regex(job_props.filter_branch_regex)
                            }
                            buildStatusNameCustomPart {
                                buildStatusNameCustomPart("${job_name}")
                                // Overwrites the build status name including the jenkinsci default part.
                                // Instead of 'jenkinsci/custom/branch' just 'custom/branch'.
                                buildStatusNameOverwrite(true)
                            }
                        }
                    }
                }
                strategy{
                    allBranchesSame{
                        props{
                            suppressAutomaticTriggering{
                                strategy('NONE')
                                triggeredBranchesRegex(job_props.trigger_branch_regex)
                            }
                        }
                    }
                }
            }
        }
        triggers {
            periodicFolderTrigger {
                interval("24h")
            }
        }
        orphanedItemStrategy {
            discardOldItems {
                daysToKeep(1)
                numToKeep(3)
            }
        }
    }
}

也可通过手动配置多分支管道(MBP),并设置分支创建/SCM变更时不自动运行来复现问题。

复现步骤

  • 创建新分支→job1和job2未运行,且无“带参数构建”按钮
  • 触发job1构建→因参数缺失失败,但“带参数构建”按钮出现
  • 带参数触发job1构建→执行成功,触发job2但job2因参数缺失失败

内容的提问来源于stack exchange,提问作者Kamil Strzempowicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:17:06