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

如何在Jenkins流水线中给函数传参并让SSH命令获取变量值

Jenkins SSH命令正确传递Groovy变量的解决方法

问题原因

你的脚本里SSH命令无法正确输出${name}的值,核心原因有两个:

  1. Groovy中单引号字符串不会执行变量插值,sh 'ssh -i @hostId "echo Hello ${name}"'里的${name}会被原样传给远程shell,而远程环境中不存在name变量,导致输出异常。
  2. 引号嵌套逻辑混乱,远程shell无法正确解析命令结构。

解决方案

以下两种方法都可以解决问题,按需选择:

方法一:使用Groovy双引号实现变量插值,转义远程shell引号

把sh命令的单引号替换为双引号,让Groovy先完成${name}的插值,同时转义远程shell需要的双引号,确保命令被正确解析:

def Greet(name){
  echo "Hello ${name}" // 正常输出Hello Amol
  sh "ssh -i @hostId \"echo Hello ${name}\"" 
}

node() {
  stage("Hello") {
    Greet('Amol')
  }
}

方法二:通过环境变量传递变量,避免引号嵌套问题

先将Groovy变量赋值给shell环境变量,再在SSH命令中引用该环境变量,这种方式可读性更强,也能避免引号冲突:

def Greet(name){
  echo "Hello ${name}"
  // 方式1:在SSH命令外定义环境变量
  sh "NAME=${name} ssh -i @hostId 'echo Hello \$NAME'"
  // 方式2:用三重双引号换行,更清晰
  sh """
    ssh -i @hostId 'echo Hello \$NAME'
  """
}

node() {
  stage("Hello") {
    Greet('Amol')
  }
}

注意事项

  • @hostId需要是Jenkins中已正确配置的SSH凭证ID,确保凭证有目标主机的访问权限,否则会出现连接失败问题。
  • 远程shell中的变量前要加反斜杠\$,防止Groovy提前插值,确保变量由远程shell解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:52:26