Как перечислить все свойства `env` в работе конвейера jenkins?

Учитывая построенный конвейер jenkins 2.1, jenkins внедряет env переменная в node{}, Например, BRANCH_NAME можно получить доступ с

node {
    echo ${env.BRANCH_NAME}
    ...

Я хочу повторить все env свойства в трубопроводе Дженкинса.

Я ищу код как

node {
    for(e in env){
        echo e + " is " + ${e}
    }
    ...

что бы повторить что-то вроде

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

20 ответов

Согласно документации Jenkins для декларативного трубопровода:

sh 'printenv'

Для скриптового конвейера Jenkins:

echo sh(script: 'env|sort', returnStdout: true)

Выше также сортирует ваши env vars для удобства.

Другой, более краткий способ:

node {
    echo sh(returnStdout: true, script: 'env')
    // ...
}

ср https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/

Следующие работы:

@NonCPS
def printParams() {
  env.getEnvironment().each { name, value -> println "Name: $name -> Value $value" }
}
printParams()

Обратите внимание, что он, скорее всего, потерпит неудачу при первом выполнении и потребует от вас одобрения различных подходов для запуска в песочнице jenkins. Это делается в разделе "Управление утверждением сценария Jenkins/ In-Process".

Список, который я получил, включил:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • НОМЕР СБОРКИ
  • BUILD_TAG
  • BUILD_URL
  • CLASSPATH
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • НАЗВАНИЕ РАБОТЫ
  • JOB_URL

Вы можете достичь результата, используя sh/bat шаг и readFile:

node {
    sh 'env > env.txt'
    readFile('env.txt').split("\r?\n").each {
        println it
    }
}

к несчастью env.getEnvironment() возвращает очень ограниченную карту переменных среды.

Почему все это сложно?

sh 'env'

делает то, что вам нужно (под *nix)

Кроссплатформенный способ перечисления всех переменных среды:

if (isUnix()) {
    sh env
}
else {
    bat set
}

Вот быстрый скрипт, который вы можете добавить в качестве конвейерного задания для получения списка всех переменных среды:

node {
    echo(env.getEnvironment().collect({environmentVariable ->  "${environmentVariable.key} = ${environmentVariable.value}"}).join("\n"))
    echo(System.getenv().collect({environmentVariable ->  "${environmentVariable.key} = ${environmentVariable.value}"}).join("\n"))
}

Это перечислит как системные переменные, так и переменные Jenkins.

В чистых Groovy решений, которые считывают глобальныеenv переменная не выводит на печать все переменные среды (например, в них отсутствуют переменные из environment блок, от withEnvконтекст и большинство машинно-зависимых переменных из ОС). Используя шаги оболочки, можно получить более полный набор, но для этого требуетсяnode контекст, который не всегда нужен.

Вот решение, в котором используется getContext шаг, чтобы получить и распечатать полный набор переменных среды, включая параметры конвейера, для текущего контекста.

Предупреждение: не работает в песочнице Groovy. Однако вы можете использовать его из надежной общей библиотеки.

def envAll = getContext( hudson.EnvVars )
echo envAll.collect{ k, v -> "$k = $v" }.join('\n')

Я использую плагин Blue Ocean, и мне не понравилось, что каждая запись окружения получает свой собственный блок. Я хочу один блок со всеми строками.

Печатает плохо:

sh 'echo `env`'

Печатает плохо:

sh 'env > env.txt'
for (String i : readFile('env.txt').split("\r?\n")) {
    println i
}

Печатает хорошо:

sh 'env > env.txt'
sh 'cat env.txt'

Хорошо печатает: (как упомянуто @mjfroehlich)

echo sh(script: 'env', returnStdout: true)

Самый простой и быстрый способ - использовать следующий URL-адрес для печати всех переменных среды.

http:// локальный:8080/env-vars.html/

Отображение всех переменных в системе Windows и системе Unix отличается, вы можете определить функцию для ее вызова каждый раз.

def showSystemVariables(){    
   if(isUnix()){
     sh 'env'
   } else {
     bat 'set'
   }
}

Сначала я вызову эту функцию, чтобы показать все переменные во всех сценариях конвейера.

stage('1. Show all variables'){
     steps {
         script{            
              showSystemVariables()
         }
     }
} 

Включает переменные системы и среды сборки:

      sh script: "printenv", label: 'print environment variables'

Ответы выше, теперь устарели из-за нового синтаксиса конвейера. Ниже выводятся переменные среды.

script {
        sh 'env > env.txt'
        String[] envs = readFile('env.txt').split("\r?\n")

        for(String vars: envs){
            println(vars)
        }
    }

Вы можете использоватьsh 'printenv'

       stage('1') {
    sh "printenv" 
 }

Если вы действительно хотите перебрать env список просто делаю:

def envs = sh(returnStdout: true, script: 'env').split('\n') envs.each { name -> println "Name: $name" }

Вы можете получить все переменные из своего экземпляра jenkins. Просто посетите:

  • ${jenkins_host}/env-vars.html
  • ${jenkins_host}/pipeline-syntax/globals

Я обнаружил, что это самый простой способ:

pipeline {
    agent {
        node {
            label 'master'
        }
    }   
    stages {
        stage('hello world') {
            steps {
                sh 'env'
            }
        }
    }
}

Я полагаю, что вам нужно это в форме сценария, но если кто-то еще просто хочет просмотреть графический интерфейс Jenkins, этот список можно найти, выбрав раздел "Переменные среды" в контекстном левом меню каждой сборки. Выберите проект => Выберите build => Переменные среды

Другой способ получить именно тот результат, который указан в вопросе:

envtext= "printenv".execute().text
envtext.split('\n').each
{   envvar=it.split("=")
    println envvar[0]+" is "+envvar[1]
}

Это может быть легко расширено для построения карты с подмножеством переменных env, соответствующих критериям:

envdict=[:]
envtext= "printenv".execute().text
envtext.split('\n').each
{   envvar=it.split("=")
    if (envvar[0].startsWith("GERRIT_"))
        envdict.put(envvar[0],envvar[1])
}    
envdict.each{println it.key+" is "+it.value}
Другие вопросы по тегам