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
相关产品推荐
相关产品推荐

