Jenkins pipeline:如何获取代理的主机名

bvhaajcl  于 2023-11-17  发布在  Jenkins
关注(0)|答案(3)|浏览(164)

我有两个不同的Linux服务器(prod和dev),它们具有不同的$HOSTNAME和不同的证书,默认情况下,证书以主机名命名。
现在我想在Jenkins-Pipeline中确定我在哪个主机上,从而使用正确的证书。
为此,我编写了以下测试脚本:

def labels = []
labels.add('jenkins_<agenthost>_x86')
def builders = [:]

for (x in labels) {
    def label = x
    builders[label] = {
        ansiColor('xterm') {
            node (label) {
                stage('cleanup') {
                    deleteDir()
                }
                stage('test') {
                    sh """
                        echo $HOSTNAME
                    """
                }
            }
        }
    }
}

parallel builders

字符串
因为$HOSTNAME没有定义,所以它不起作用。

groovy.lang.MissingPropertyException: No such property: HOSTNAME for class: groovy.lang.Binding


如何在管道中的sh中获取jenkins-agent的主机名?
因为你可以用任何你喜欢的方式命名节点,你不能只使用NODE_NAME,它不必与你在代理机器上的bash上从echo $HOSTNAME获得的$HOSTNAME相同。

bgibtngc

bgibtngc1#

def getJenkinsMaster() {
    return env.BUILD_URL.split('/')[2].split(':')[0]
}

字符串
您可以从URL获取主机名

dz6r00yl

dz6r00yl2#

sh "echo ${env.NODE_NAME}"

字符串
您可以添加此shell命令并从环境变量中获取主机名。

mrzz3bfm

mrzz3bfm3#

不是sh step,但你可以使用groovy:

import java.security.MessageDigest
import org.jenkinsci.plugins.workflow.cps.CpsThread
import hudson.FilePath

@NonCPS
def get_current_pipeline_node() {
    def thread = CpsThread.current()
    def cv = thread.contextVariables
    def fp
    try {
        fp = cv.get(FilePath, null, null)
    } catch(MissingMethodException) {
        fp = cv.get(FilePath)
    }
    return fp?.toComputer()?.node
}
node = get_current_pipeline_node()
print(node.nodeName)

字符串

相关问题