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
相关产品推荐
相关产品推荐

