6

我有一个 Jenkins 声明式管道,我在其中一个阶段构建并在另一个阶段在不同的机器上进行测试。我还有一个 Selenium 集线器,它与 Jenkins 主服务器在同一台机器上运行。

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 master URL / hostname 不在环境变量中,我不确定如何获取 Jenkins master 的 IP 地址。

4

5 回答 5

4

不确定是否有更好的方法可以做到这一点,我可以运行

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

在我的詹金斯文件中。我第一次在我的 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

于 2017-08-08T23:18:44.773 回答
3

获取当前从主机:

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

获取主主机:

Jenkins.getInstance().getComputer('').getHostName()
于 2018-05-23T16:37:21.853 回答
3

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

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

这将返回主服务器的主机名或 IP,因为它会出现在构建 URL 中。如果您还需要端口号,请删除第二个split().

于 2017-12-01T15:26:43.880 回答
1

你可以简单地这样做:

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

并将"hostname -i".execute().text打印IP

于 2020-05-07T15:25:41.097 回答
0

在 shell 命令下面试试这个

def host= sh(returnStdout: true, script: 'echo ${BUILD_URL/https:\\/\\/} | cut -d "/" -f1').trim()
println("Hostname : ${host}")
于 2017-10-13T01:58:54.250 回答