Как перечислить все свойства `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)
}
}
ref: https://www.jenkins.io/doc/pipeline/tour/environment/
node {
sh 'printenv'
}
Вы можете использовать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}