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

