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

如何在Groovy中访问Jenkins作业参数?

问题原因分析

你的核心问题混淆了Jenkins DSL脚本编译阶段和Job运行阶段的变量作用域:

  1. 使用$ENTERPRISESERVER时,Groovy会在编译DSL脚本阶段尝试解析这个变量,但该变量是Job运行时才会生成的参数,编译阶段不存在,因此抛出MissingPropertyException。
  2. 使用'${ENTERPRISESERVER}'赋值后插入PowerShell脚本,最终传递给PowerShell的是字面量${ENTERPRISESERVER},PowerShell无法识别该语法(除非依赖Jenkins预替换,但你的写法未触发正确替换)。
可行解决方案

方案1:使用Jenkins环境变量(推荐)

Jenkins会自动将作业参数注入到环境变量中,PowerShell可通过$env:参数名直接读取。用Groovy的单引号多行字符串(''')包裹PowerShell代码,避免Groovy插值:

dslFactory.job(name) {
    parameters {
        activeChoiceParam('ENTERPRISESERVER') {
            description('')
            choiceType('SINGLE_SELECT')
            groovyScript {
                script("""[
                    "vws-10-persmft",
                    "vws-10-persmft2",
                    "vws-10-persmft3",
                    // "vws-10-persmfe",
                    // "vws-10-persmfe2",
                    "vts-10-perse9",
                    //"vts-10-perse8",
                    //"vts-10-perse7",
                    "vws-10-perskmt5"
                ]""")
            }
        }
    }

    steps {
        powerShell '''
            Write-Output "Target Server: $env:ENTERPRISESERVER"
            Invoke-Command -ComputerName $env:ENTERPRISESERVER -ScriptBlock {
                Restart-Service -Name 'SEEShutdown';
                Restart-Service -Name 'SEEMonitor';
            };
        '''
    }
}

方案2:依赖Jenkins变量预替换

让Jenkins在执行PowerShell步骤前替换${ENTERPRISESERVER},同样用单引号多行字符串确保Groovy不修改该变量:

dslFactory.job(name) {
    parameters {
        activeChoiceParam('ENTERPRISESERVER') {
            description('')
            choiceType('SINGLE_SELECT')
            groovyScript {
                script("""[
                    "vws-10-persmft",
                    "vws-10-persmft2",
                    "vws-10-persmft3",
                    // "vws-10-persmfe",
                    // "vws-10-persmfe2",
                    "vts-10-perse9",
                    //"vts-10-perse8",
                    //"vts-10-perse7",
                    "vws-10-perskmt5"
                ]""")
            }
        }
    }

    steps {
        powerShell '''
            Write-Output 'Target Server: ${ENTERPRISESERVER}'
            Invoke-Command -ComputerName '${ENTERPRISESERVER}' -ScriptBlock {
                Restart-Service -Name 'SEEShutdown';
                Restart-Service -Name 'SEEMonitor';
            };
        '''
    }
}
关键注意点
  • 不要在DSL脚本的Groovy代码中直接引用Job运行时参数(如$ENTERPRISESERVER),DSL仅负责生成Job配置,编译阶段无运行时变量。
  • 传递PowerShell代码时,优先用单引号多行字符串避免Groovy意外插值;若必须用双引号,需转义$(如\$env:ENTERPRISESERVER)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:35:18