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

Jenkins DSL Shell脚本中无法创建变量的问题求助

解决Jenkins DSL Shell脚本中变量定义报错的问题

嘿,这个问题我太熟悉了!你碰到的其实是Groovy字符串插值和Shell变量的冲突问题,我来给你拆解一下:

问题原因

Jenkins DSL基于Groovy语言编写,当你用**双引号""**包裹Shell脚本内容时,Groovy会自动对字符串里的$符号进行插值解析——它会把$MY_VARIABLE当成Groovy代码里的变量,但你并没有在Groovy层面定义这个变量,所以就触发了No such property: MY_VARIABLE的错误。

两种解决方案

方案1:改用单引号包裹Shell脚本

Groovy不会对单引号''包裹的字符串进行插值处理,整个内容会原封不动地传给Shell执行,这样Shell就能正确识别自己的变量了:

job('ci') {
    description 'Build and test the app.'
    scm {
        github 'sheehan/job-dsl-playground'
    }
    steps {
        gradle 'test'
        shell('''#!/bin/bash
MY_VARIABLE=5
echo $MY_VARIABLE
''')
    }
    publishers {
        archiveJunit 'build/test-results/**/*.xml'
    }
}

方案2:转义Shell变量的$符号

如果你因为某些原因必须使用双引号(比如需要在Shell脚本中插入Groovy变量),可以给Shell变量的$加上反斜杠\进行转义,让Groovy忽略这个插值操作:

job('ci') {
    description 'Build and test the app.'
    scm {
        github 'sheehan/job-dsl-playground'
    }
    steps {
        gradle 'test'
        shell("""#!/bin/bash
MY_VARIABLE=5
echo \$MY_VARIABLE
""")
    }
    publishers {
        archiveJunit 'build/test-results/**/*.xml'
    }
}

总结

在Jenkins DSL中编写Shell脚本时,一定要注意Groovy的字符串插值特性:

  • 单引号字符串:Groovy不做任何解析,直接传递给Shell
  • 双引号字符串:Groovy会先解析所有$开头的变量,再传递给Shell

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:23:20