Как вывести список всех свойств env в задании конвейера jenkins?

106

Учитывая конвейер сборки 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
 ...
Джеймс Томас, Луна, 1979
источник
env - это карта. Пробовали нормальную итерацию? like - env.each {println it}
Jayan
3
Похоже на дубликат stackoverflow.com/questions/36836806/…
Кшиштоф Красонь
3
Afaik env просто инкапсулирует переменные среды. Я не думаю, что вы сможете пройти через это. Попробуйте 'sh env' в Linux / 'bat set' в Windows.
Доминик Гебхарт
1
@Renato @Jayan согласно моему комментарию ниже, env.each { name, value -> println "Name: $name -> Value $value" }печатает Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979,
1
@ JamesThomasMoon1979 Это потому, что Pipeline нарушает замыкания Groovy. Если вы исправите его в старом стиле Java (то есть new ClassName() { ... }), он должен работать. Или вы запускаете его в методе с тегами @NonCPS, тогда и внутри него будут работать замыкания.
Daniel C. Sobral

Ответы:

87

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

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

ср. https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script

Mjfroehlich
источник
21
Заменить shна batи envна setпод Windows.
jmkgreen
1
Для случая "sh" я использую 'env | sort ', потому что меня сводит с ума то, что он не упорядочен по ключу.
Джефф Хаттон
83

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

sh 'printenv'

Для конвейера со сценарием Jenkins :

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

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

Wimateeka
источник
2
printenvэто просто команда оболочки, которая печатает среду, ничего специфичного для Jenkins. Без аргументов это эквивалентно envбез аргументов. Я почти уверен, что sh 'printenv | sort'будет работать в DCL или в сценарии конвейера.
simon.watts
Протестировано и sh 'printenv | sort'действительно работает для декларативного конвейера Jenkins; fwiw sh 'env | sort'также работает (оба протестированы на Jenkins версии 2.46.1). Первоначально я упомянул, sh 'printenv'потому что на него есть ссылка в официальной документации Jenkins.
Wimateeka
1
Если вы потеряете returnStdout: true, вам не нужно эхо; Он просто печатает то, что уже напечатал сценарий оболочки.
Эд Рэндалл
26

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

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

Обратите внимание, что он, скорее всего, завершится ошибкой при первом выполнении и потребует одобрения различных методов Groovy для запуска в песочнице jenkins. Это делается в «управлении утверждением jenkins / внутрипроцессного скрипта»

В список попали:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • НОМЕР СБОРКИ
  • BUILD_TAG
  • BUILD_URL
  • КЛАСС
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • НАЗВАНИЕ РАБОТЫ
  • JOB_URL
Омри Спектор
источник
1
Это не работает:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
Octavian
5
Вы обязательно включили @NonCPS?
Joe C.
1
Это лучший ответ, потому что он будет работать вне блока узла . Большое спасибо за это.
Gi0rgi0s 06
15

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

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

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

luka5z
источник
2
sh 'env > env.txt'работает хорошо и включает переменные среды, созданные процессом оболочки. env.getEnvironment()показывает только переменные среды набора Jenkins, которые являются подмножеством того, что видно в sh 'env'технике. Кроме того, требуется одобрение безопасности сценария method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment. env.each { name, value -> println "Name: $name -> Value $value" }Рекомендовано @Renato @Jayan только печатает Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979,
Ницца!!! Возможность распечатать все переменные env помогла мне обнаружить, что Jenkins 2 устанавливает переменную JOB_BASE_NAME, содержащую имя задания без папки, в которой оно находится.
Билл Эйджи,
версия, которая работает в Windows, тоже была бы потрясающей :)
Bas Hamer
@Bas Hamer для версии для Windows попробуйте заменить «sh» на «bat»
Себастьян
2
Выдает ошибку java.lang.UnsupportedOperationException: вызов общедоступного статического java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) в закрытии, преобразованном в CPS, не пока поддерживается (JENKINS-26481); инкапсулировать в метод @NonCPS или использовать циклы в стиле Java
Бен Мэтьюз,
12

К чему вся эта сложность?

sh 'env'

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

Андрей Регентов
источник
Для этого требуется блок узла. Для моего варианта использования мне нужно определить, в какой среде будет находиться узел, а затем развернуть узел на основе определенных критериев.
Билл Уорнер,
10

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

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

В нем будут перечислены как системные переменные, так и переменные Jenkins.

Даниэль
источник
9

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

if (isUnix()) {
    sh env
}
else {
    bat set
}
Терри
источник
7

Я использую плагин 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)
Джон Лауридсен
источник
3

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

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

        for(String vars: envs){
            println(vars)
        }
    }
Эдди
источник
1
1. Вы должны иметь его в блоке скрипта. 2. Они недооценивают цикл «заводного стиля».
Эдди
С forзакрытием также вызовет проблемы без @NonCPSаннотации.
нарисовал 09
3

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

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

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

def envAll = getContext( hudson.EnvVars )
echo envAll.collect{ k, v -> "$k = $v" }.join('\n')
zett42
источник
1

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

def envs = sh(returnStdout: true, script: 'env').split('\n')
envs.each { name  ->
    println "Name: $name"
}
Дсайдон
источник
0

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

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

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

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}
Римский
источник
0

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

введите описание изображения здесь

Claudod
источник
2
Это не всегда доступно.
shuckc
1
Я не думаю, что он вообще доступен для Jenkinsfiles. Скриншот выглядит как вольная сборка.
Якуб Боченски,
0

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

pipeline {
    agent {
        node {
            label 'master'
        }
    }   
    stages {
        stage('hello world') {
            steps {
                sh 'env'
            }
        }
    }
}
Просенджит Сен
источник
-1

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

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / pipeline-syntax / globals
Дмитрий Тарасевич
источник