Як перелічити всі властивості `env` в роботі трубопроводу Jenkin?


105

З огляду на побудову трубопроводу джинкіни 2.1, дженкіни вводять 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 - карта. Ви спробували нормальну ітерацію? як - env.each {println it}
Jayan

3
Виглядає як дублікат stackoverflow.com/questions/36836806 / ...
Кшиштоф Krasoń

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 Це тому, що трубопровід руйнує закриття Groovy. Якщо ви маєте право на старий-Java-стиль (тобто new ClassName() { ... }), він повинен працювати. Або запустити його методом, позначеним тегом @NonCPS, і закриття також буде працювати всередині цього.
Даніель К. Собрал

Відповіді:


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 |" сортувати ", бо це мене зводить з розуму, що це не впорядковано за ключем.
Джефф Хаттон

80

Відповідно до документації Дженкінса для декларативного трубопроводу :

sh 'printenv'

Для сценарію Дженкінса :

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

Сказане також сортує ваші околиці для зручності.


1
printenvце лише команда оболонки, яка друкує середовище, нічого специфічного для Дженкінса. Без аргументів це рівнозначно envбез аргументів. Я впевнений, що це sh 'printenv | sort'буде працювати в DCL або сценаріях.
simon.watts

Випробуваний і sh 'printenv | sort'насправді працює для декларативного трубопроводу Дженкінса; fwiw sh 'env | sort'також працює (обидва випробувані на версії Дженкінса, 2.46.1). Я спочатку згадував, sh 'printenv'тому що на нього посилалося в офіційній документації Дженкінса.
Wimateeka

1
Якщо ви втратите returnStdout: true, тоді ехо вам не потрібно; Це просто надрукувати те, що вже надруковано сценарій оболонки.
Ед Рандалл

26

Наступні роботи:

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

Зауважте, що він, швидше за все, не вдасться при першому виконанні і вимагатиме схвалення різноманітних методів для запуску в пісочниці jenkins. Це робиться в "керуванні схваленням jenkins / у процесі затвердження сценарію"

Список, який я потрапив:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • BUILD_NUMBER
  • BUILD_TAG
  • BUILD_URL
  • КЛАССПАТ
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • JOB_NAME
  • JOB_URL

1
Це не працює:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
октавіан

5
Ви обов'язково включили @NonCPS?
Джо К.

1
Це найкраща відповідь, оскільки вона працюватиме поза блоком вузлів . Дуже дякую за це.
Gi0rgi0s

15

Ви можете досягти результату, використовуючи sh/ batstep та readFile:

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

На жаль, env.getEnvironment()повертає дуже обмежену карту змінних середовища.


1
sh 'env > env.txt'працює добре і включає змінні середовища, створені процесом оболонки. env.getEnvironment()показує лише змінні середовища набору Дженкінса, які є підмножиною тієї, що спостерігається в 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 vars допомогла мені виявити, що Jenkins 2 встановлює змінний JOB_BASE_NAME, містить назву роботи, не містить папки, в якій вона живе.
Білл Agee

версія, яка працює на 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
Ben Mathews

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"))
}

Тут буде перераховано як системні, так і змінні Дженкінса.


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. Вони знецінюють цикл 'groovy style'.
Едді

forІз закриттям також викличе проблеми без @NonCPSанотацій.
деруш

2

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

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

Caveat: Не працює в грунтовій пісочниці. Ви можете використовувати його з надійної спільної бібліотеки.

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

Я вважаю, що вам це знадобилось у вигляді сценарію, але якщо хтось ще хоче переглянути його через графічний інтерфейс Дженкінса, цей список можна знайти, вибравши розділ "Змінні середовища" у контекстному лівому меню кожного вибору проекту Select = > Виберіть build => Змінні середовища

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


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} / конвеєр-синтаксис / глобалі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.