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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:06:34