如何在从属服务器上执行的管道阶段中获取Jenkins主IP /主机名?

时间:2017-08-08 22:28:45

标签: jenkins jenkins-pipeline jenkins-declarative-pipeline

我有一个Jenkins声明性管道,我在一个阶段构建并在另一个阶段在不同的机器上进行测试。我还有一个与Jenkins master在同一台机器上运行的Selenium集线器。

pipeline {
  agent none
  stages {
    stage('Build') {
      agent { node { label 'builder' } }
      steps {
        sh 'build-the-app'
        stash(name: 'app', includes: 'outputs')
      }
    }
    stage('Test’) {
      agent { node { label 'tester' } }
      steps {
        unstash 'app'
        sh 'test-the-app'
      }
    }
  }
}

我希望在测试阶段运行的Selenium测试连接回Jenkins主机上的Selenium集线器,这意味着我需要获取Jenkins主机的IP地址或主机名来自奴隶的机器。

有办法做到这一点吗? Jenkins主URL /主机名不在环境变量中,我不确定如何获取Jenkins主站的IP地址。

5 个答案:

答案 0 :(得分:2)

不确定是否有更好的方法可以执行此操作,我可以运行

def masterIP = InetAddress.localHost.hostAddress
println "Master located at ${masterIP}"

在我的Jenkins文件中。我第一次在Jenkinsfile中运行此代码时,构建失败并带有

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: 
Scripts not permitted to use method java.net.InetAddress getHostAddress
at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectMethod(StaticWhitelist.java:178)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor$6.reject(SandboxInterceptor.java:243)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:363)
at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:241)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:238)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:28)

我必须通过导航到Manage Jenkins>来批准Jenkins中的方法签名。 In-process Script Approval

答案 1 :(得分:2)

受到@kayvee的启发,使用了BUILD_URL,以下是我的工作:

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

这将返回主体的主机名或IP,就像它在构建URL中显示的那样。如果您还需要端口号,请删除第二个split()

答案 2 :(得分:1)

您可以像这样简单地进行操作:

PYTHONPATH=../../dags python3 external.py

stage("SomeStageName") { agent { label 'exampleRunOnlyOnLinuxNode' } steps { script { println "\n\n-- Running on machine: " + "hostname".execute().text } } } 将打印IP

答案 3 :(得分:0)

尝试以下shell命令

def host= sh(returnStdout: true, script: 'echo ${BUILD_URL/https:\\/\\/} | cut -d "/" -f1').trim()
println("Hostname : ${host}")

答案 4 :(得分:0)

获取当前的从属主机:

Jenkins.getInstance().getComputer(env['NODE_NAME']).getHostName()

获得主人:

Jenkins.getInstance().getComputer('').getHostName()