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

Jenkins Job DSL如何在Node阶段Shell脚本中访问String参数?

问题分析与解决方案

你的问题核心出在Groovy字符串的插值时机上:当你用双引号"""包裹流水线脚本时,Groovy会在DSL定义阶段就尝试解析${params.ENV},但此时params对象还不存在(params是流水线运行时才会生成的上下文变量),所以这个表达式会被解析为空或无效值,导致shell脚本里拿不到正确的参数。

下面给你几种可行的解决方法:

方法1:转义Groovy插值符号

在shell脚本里的${params.ENV}前添加反斜杠,让Groovy放弃提前解析这个表达式,而是把它原封不动地传递给Jenkins流水线运行时处理:

pipelineJob('pipeline') 
{
  logRotator(numToKeep = 100)
    parameters {
        stringParam("ENV", "dev" , "dev")
        }
definition {    
    cps {
      sandbox()
      script("""
        node {
          stage('Pre Build Test') {

              sh '''#!/bin/bash
              echo "Will deploy to \${params.ENV}" '''
          }
        }""".stripIndent())
    }
  }
}    

方法2:改用单引号包裹流水线脚本

Groovy对单引号字符串不会做插值处理,整个脚本会原封不动地传递给Jenkins运行时,此时${params.ENV}就能被流水线正确解析:

pipelineJob('pipeline') 
{
  logRotator(numToKeep = 100)
    parameters {
        stringParam("ENV", "dev" , "dev")
        }
definition {    
    cps {
      sandbox()
      script('''
        node {
          stage('Pre Build Test') {

              sh '''#!/bin/bash
              echo "Will deploy to ${params.ENV}" '''
          }
        }'''.stripIndent())
    }
  }
}    

方法3:先赋值Groovy变量再传递

在流水线运行时先把params.ENV赋值给一个Groovy变量,再传递给shell脚本,这种方式更清晰,也能避免多层引号的插值冲突:

pipelineJob('pipeline') 
{
  logRotator(numToKeep = 100)
    parameters {
        stringParam("ENV", "dev" , "dev")
        }
definition {    
    cps {
      sandbox()
      script("""
        node {
          def targetEnv = params.ENV
          stage('Pre Build Test') {
              // 用单引号包裹shell内容,直接拼接Groovy变量
              sh '''#!/bin/bash
              echo "Will deploy to ''' + targetEnv + '''" '''
          }
        }""".stripIndent())
    }
  }
}    

总结

核心思路就是避免Groovy在DSL定义阶段提前解析流水线运行时的变量,要么转义插值符号,要么用单引号隔离,要么在运行时先拿到变量再传递给shell。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:14:13