Jenkinsfile中sshagent步骤内如何正确引用已定义的变量
问题根因
Jenkins Pipeline基于Groovy语法实现,字符串插值有明确规则:
- 用单引号(
')包裹的字符串是纯字面量,不会替换字符串内的${}格式占位符 - 用双引号(
")包裹的字符串才会触发Groovy层面的变量替换,将当前作用域下的对应变量值填充到占位符位置
你原有代码中sh步骤的执行命令整体用单引号包裹,Groovy不会替换其中任何${}占位符。你观察到的${ARGUMENT}能正常解析,是因为未被替换的整串命令传给本地shell执行时,刚好本地shell环境存在同名的ARGUMENT环境变量被意外匹配,而USER、ADRESS没有对应同名环境变量,因此被解析为空字符串。
修正代码
将sh步骤的外层包裹字符串从单引号改为双引号,同时对内层传递给远程ssh的命令所用的双引号做转义,避免和外层双引号产生语法冲突,修正后完整代码如下:
node{ def USER = "user" def ADRESS= "adress" def ARGUMENT= "argument" stage('test'){ sshagent(['123123']) { sh "ssh ${USER}@${ADRESS} \"command ${ARGUMENT} && command\"" } } }
补充注意事项
- 如果ssh远程执行的命令中,包含需要远程服务器端shell解析的变量(而非Jenkins Pipeline中定义的本地变量),需要对这类变量的
$符号做转义,写作\$变量名,避免被Groovy提前替换。例如需要读取远程机器的$PATH环境变量时,要写成\$PATH。 - 注意变量名拼写一致性,你代码中定义的
ADRESS为非标准拼写(常规拼写为ADDRESS),如果后续代码引用时拼写不一致,也会触发变量为空的问题。
内容的提问来源于stack exchange,提问作者AliceTheCat
相关产品推荐
相关产品推荐

