jenkinsパイプラインジョブ内のすべての `env`プロパティをリストする方法は?


105

jenkins 2.1ビルドパイプラインを指定すると、jenkinsはenv変数をに注入しますnode{}。たとえば、次のBRANCH_NAMEようにしてアクセスできます

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

jenkinsパイプライン内のすべての 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は環境変数をカプセル化するだけです。あなたはそれをループできるとは思わない。Linuxでは「sh env」、Windowsでは「bat set」を試してください。
Dominik Gebhart 2016年

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

回答:



80

よると、ジェンキンスのドキュメントのための宣言型のパイプライン

sh 'printenv'

Jenkins スクリプトパイプラインの場合

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

上記では、便宜上、環境変数も並べ替えています。


1
printenvJenkinsに固有の環境を出力する単なるシェルコマンドです。引数なしは、引数なしと同等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を失った場合、エコーは必要ありません。シェルスクリプトがすでに印刷したものを印刷しているだけです。
Ed Randall

26

以下の作品:

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

ほとんどの場合、最初の実行で失敗し、jenkinsサンドボックスで実行するにはさまざまなgroovyメソッドを承認する必要があることに注意してください。これは、「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
オクタヴィアン

5
必ず含め@NonCPSますか?
Joe C.

1
これはノードブロックの外部で機能するため、最良の答えです。本当にありがとうございました。
Gi0rgi0s

15

sh/ batステップを使用して結果を達成できます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'テクニックで見られる環境変数のサブセットであるJenkinsセットの環境変数のみを示しています。また、スクリプトのセキュリティ承認が必要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を印刷できることは、私はJOB_BASE_NAMEのvarはジョブ名のsansそれがに住んでいるフォルダが含まれているジェンキンス2セットしていることがわかりました。
ビル・アゲ

Windowsで動作するバージョンも素晴らしいでしょう:)
Bas Hamer

@Bas Hamer for Windowsバージョンは、「sh」を「bat」に置き換えようとします
Sebastien

2
CPSで変換されたクロージャーでエラーjava.lang.UnsupportedOperationException:Calling public static java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each(java.lang.Object、groovy.lang.Closure)が呼び出されないまだサポートされています(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"))
}

これにより、システム変数とJenkins変数の両方がリストされます。


9

すべての環境変数をリストするクロスプラットフォームの方法:

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

7

Blue Oceanプラグインを使用していますが、各環境エントリが独自のブロックを取得するのが好きではありませんでした。すべての行を含む1つのブロックが必要です。

印刷が不十分:

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.彼らは「グルーヴィーなスタイル」のループの価値を下げています。
Eddie

forクロージャともせずに問題が発生します@NonCPS注釈。
描画

2

純粋なGroovyのグローバル読みソリューションenvすべての環境変数を印刷していない変数は、(例えば、それらからの変数が欠落しているenvironmentから、ブロックwithEnvコンテキストおよびOSからマシン固有の変数のほとんど)。シェルステップを使用すると、より完全なセットを取得でき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]
}

これは簡単に拡張して、基準に一致する環境変数のサブセットを含むマップを構築できます。

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 GUIを調べたいだけの場合は、すべてのビルドのコンテキスト左側のメニューで「環境変数」セクションを選択すると、そのリストを見つけることができます。 >ビルドを選択=>環境変数

ここに画像の説明を入力してください


2
これは常に利用できるとは限りません。
shuckc

1
Jenkinsfilesでは利用できないと思います。スクリーンショットはフリースタイルのビルドのように見えます。
Jakub Bochenski、

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.