Как вывести список всех свойств 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
 ...

env - это карта. Пробовали нормальную итерацию? like - env.each {println it}
Jayan


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


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 для удобства.


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()возвращает очень ограниченную карту переменных среды.


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')

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, этот список можно найти, выбрав раздел «Переменные среды» в контекстном левом меню каждой сборки. Выберите проект = > Выберите сборку => Переменные среды

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.