Как получить главный IP-адрес/имя хоста Jenkins внутри этапа конвейера, выполняющегося на подчиненном устройстве?

У меня есть декларативный конвейер 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, которые выполняются на этапе Test, подключались обратно к концентратору Selenium на главной машине Jenkins, а это означает, что мне нужно получить IP-адрес или имя хоста главной машины Jenkins от ведомого.

Есть ли способ сделать это? Основной URL/имя хоста Jenkins отсутствует в переменных среды, и я не уверен, как еще получить IP-адрес мастера Jenkins.


person Community    schedule 08.08.2017    source источник


Ответы (5)


Не уверен, что есть лучшие способы сделать это, я могу запустить

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)

Мне пришлось утвердить подпись метода в Jenkins, перейдя к Manage Jenkins > In-process Script Approval.

person ivan.sim    schedule 08.08.2017

Вдохновленный @kayvee для использования BUILD_URL, у меня получилось следующее:

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

Это возвращает имя хоста или IP-адрес мастера, как это будет отображаться в URL-адресе сборки. Если вам также требуется номер порта, удалите второй split().

person urban    schedule 01.12.2017
comment
Это не сработает, если Jenkins работает за обратным прокси-сервером. - person Alex O; 16.11.2018

Чтобы получить текущий подчиненный хост:

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

Чтобы получить главный хост:

Jenkins.getInstance().getComputer('').getHostName()
person ldenisey    schedule 23.05.2018
comment
это, вероятно, вернет идентификатор контейнера, если вы используете jenkins в докере - person James Robert Albert; 19.08.2020
comment
Я подтверждаю, это действительно возвращает имя хоста докера - person Ordiel; 16.09.2020

Вы можете просто сделать это следующим образом:

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

и "hostname -i".execute().text напечатает IP

person AKS    schedule 07.05.2020

Попробуйте эту команду оболочки ниже

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