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

Jenkins Pipeline的sh步骤中如何获取agent节点实际主机名

问题原因

你遇到的报错是因为Groovy字符串插值优先级高于shell变量解析:你在sh步骤里用了双引号包裹脚本内容,Groovy会先尝试解析字符串内的$HOSTNAME作为Groovy全局变量,而不是把它传递给shell层解析,因此触发了找不到属性的报错。

解决方案

方案1:直接在shell层读取主机名(仅shell内使用)

两种修改方式二选一即可:

  • 把sh脚本的双引号改为单引号,关闭Groovy字符串插值:
sh '''
    echo $HOSTNAME
'''
  • 如果必须用双引号(比如需要穿插Groovy变量),给$加转义符,告诉Groovy不解析这个变量:
sh """
    echo \$HOSTNAME
"""

方案2:把主机名读取为Groovy变量(后续Pipeline逻辑需要用到)

如果需要根据主机名判断加载对应证书,可以用sh步骤的returnStdout参数直接把shell输出赋值给Groovy变量:

stage('test') {
    // 读取agent实际主机名并去除首尾空白字符
    def agentHostname = sh(script: 'echo $HOSTNAME', returnStdout: true).trim()
    // 后续可以直接用这个变量判断证书
    def certPath = agentHostname == '你的prod主机名' ? '/path/to/prod.crt' : '/path/to/dev.crt'
    // 后续业务逻辑使用certPath即可
    sh """
        echo 当前agent主机名:${agentHostname}
        echo 使用证书路径:${certPath}
    """
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:00:00