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

Jenkins主任务执行带参数的可变并行子任务后无法正常结束问题排查

问题分析与解决方案

你的主任务挂起的核心原因是在@NonCPS方法中创建并行任务的闭包,这会破坏Jenkins Pipeline的CPS(Continuations Passing Style)变换机制,导致Jenkins无法正确跟踪子任务的执行状态——即使子任务完成,主任务也会一直等待未被正确标记的任务。另外,参数类型警告虽然不是挂起的直接原因,但也可以一并解决。

具体问题点拆解

  1. @NonCPS方法中创建闭包:@NonCPS注解会让方法脱离Jenkins的CPS变换,而并行任务的闭包需要依赖CPS来跟踪执行状态。你原来的代码在makeList方法里直接生成闭包并返回,这些闭包无法被Jenkins正确管理,导致主任务无法感知子任务的完成。
  2. 弃用的API调用:hudson.model.Hudson.instance已经被Jenkins弃用,应该使用Jenkins.get()来获取Jenkins实例。
  3. 参数类型转换警告:子任务期望的是Persistent String Parameter,而你传递的是普通字符串参数,导致Jenkins自动转换并抛出警告。

修正后的完整代码

import hudson.model.PersistentStringParameterValue

@NonCPS
def getRunJobNames() {
    // 使用最新的Jenkins API替代弃用的Hudson.instance
    def jenkinsInstance = Jenkins.get()
    def wssView = jenkinsInstance.getView('WSS')
    // 筛选出符合条件的任务全名并返回列表
    return wssView.items.findAll { job ->
        job.fullName.startsWith('wss-run')
    }.collect { it.fullName }
}

pipeline {
    agent any
    stages {
        stage('Switch') {
            steps {
                script {
                    // 先获取符合条件的任务列表
                    def targetJobs = getRunJobNames()
                    // 在CPS上下文内构建并行任务Map
                    def parallelTasks = [:]
                    
                    targetJobs.each { jobFullName ->
                        parallelTasks["Switching ${jobFullName}"] = {
                            build job: jobFullName,
                                  parameters: [
                                      // 直接传递PersistentStringParameterValue,消除类型转换警告
                                      new PersistentStringParameterValue('TARGET_BRANCH', TARGET_BRANCH)
                                  ]
                        }
                    }
                    
                    // 并行执行,failFast: false确保所有子任务完成后主任务再结束(无论成败)
                    parallel parallelTasks, failFast: false
                }
            }
        }
    }
}

关键修改说明

  • 分离任务获取与闭包构建:把获取任务列表的逻辑放在@NonCPS方法中(只返回字符串列表,不创建闭包),闭包的构建移到Pipeline的script块(CPS上下文)中,确保Jenkins能正确跟踪每个并行任务的状态。
  • 替换弃用API:用Jenkins.get()替代Hudson.instance,符合Jenkins LTS 2.346.2的API规范。
  • 消除参数警告:直接使用PersistentStringParameterValue传递参数,匹配子任务的参数类型,避免自动转换。
  • failFast: false配置:确保即使部分子任务失败,主任务也会等待所有子任务执行完毕后再结束,完全符合你的需求。

额外注意事项

如果运行时遇到权限问题(比如无法调用Jenkins.get()或PersistentStringParameterValue),需要在Jenkins后台的Manage Jenkins → In-process Script Approval页面,授权对应的方法和类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:49:05