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

Jenkins JobDSL脚本问题:Groovy变量如何传入Shell命令

解决Jenkins JobDSL中Groovy变量无法传入Shell命令的问题

核心原因

JobDSL的Groovy脚本里,单引号包裹的字符串不会触发Groovy变量插值,如果你的shell命令用了单引号,$group这类变量会被当成bash原生变量,而非Groovy中定义的变量,自然不会被替换。

正确实现方式

1. 使用Groovy双引号字符串(推荐)

直接用双引号包裹shell命令,Groovy会自动替换其中的变量:

def jobName = "my-build-job"
def group = "my-group"
def project = "my-project"
def ext = "jar"

job(jobName) {
    steps {
        shell """
            echo "Group: ${group}, Project: ${project}"
            mvn clean package -DgroupId=${group} -DartifactId=${project} -Dpackaging=${ext}
        """
    }
}

注意:如果shell命令里需要用到bash原生变量(比如$HOME),要转义成\$HOME,避免被Groovy误插值。

2. 字符串拼接方式

如果习惯用单引号,可以手动拼接Groovy变量和shell命令片段:

job(jobName) {
    steps {
        shell 'echo "Group: ' + group + ', Project: ' + project + '"'
        shell 'mvn clean package -DgroupId=' + group + ' -DartifactId=' + project + ' -Dpackaging=' + ext
    }
}

3. 环境变量传递(适合复杂场景)

把Groovy变量注入到Jenkins任务的环境变量中,再在shell里引用:

job(jobName) {
    environmentVariables {
        env('GROUP', group)
        env('PROJECT', project)
        env('EXT', ext)
    }
    steps {
        shell '''
            echo "Group: $GROUP, Project: $PROJECT"
            mvn clean package -DgroupId=$GROUP -DartifactId=$PROJECT -Dpackaging=$EXT
        '''
    }
}

这种方式的好处是shell命令里的变量写法和原生bash一致,不需要转义,适合长命令或多步骤复用变量的场景。

常见误区

  • 不要在单引号字符串里直接写${group},Groovy不会处理,会原样输出到shell中
  • 不要混淆Groovy变量和bash变量,需要bash变量时记得转义Groovy的插值符号

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 21:53:06