Bagaimana cara mencantumkan semua properti `env` dalam pekerjaan pipeline jenkins?

105

Dengan adanya pipeline build jenkins 2.1, jenkins memasukkan envvariabel ke dalam node{}. Misalnya, BRANCH_NAMEbisa diakses dengan

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

Saya ingin menggemakan semua env properti dalam pipeline jenkins

... mengingat saya tidak mengetahui semua properti sebelumnya.

Saya mencari kode suka

node {
    for(e in env){
        echo e + " is " + ${e}
    }
    ...

yang akan menggemakan sesuatu seperti

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...
JamesThomasMoon 1979
sumber
env adalah peta. Apakah Anda mencoba iterasi normal? seperti - env.each {println it}
Jayan
3
Sepertinya duplikat stackoverflow.com/questions/36836806/…
Krzysztof Krasoń
3
Afaik env baru saja merangkum variabel lingkungan. Saya tidak berpikir Anda bisa mengulanginya. Coba 'sh env' di linux / 'bat set' di windows.
Dominik Gebhart
1
@Renato @Jayan sesuai komentar saya di bawah, env.each { name, value -> println "Name: $name -> Value $value" }cetakan Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979
1
@ JamesThomasMoon1979 Itu karena Pipeline merusak penutupan Groovy. Jika Anda benar menggunakan gaya Java lama (yaitu, new ClassName() { ... }), itu akan berhasil. Atau Anda menjalankannya dengan metode yang diberi tag @NonCPS, maka closure akan bekerja di dalamnya juga.
Daniel C. Sobral

Jawaban:

80

Menurut dokumentasi Jenkins untuk pipeline deklaratif :

sh 'printenv'

Untuk pipeline dengan skrip Jenkins :

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

Di atas juga mengurutkan env vars Anda untuk kenyamanan.

Wimateeka
sumber
1
printenvhanyalah perintah shell yang mencetak lingkungan, tidak ada yang khusus untuk Jenkins. Tanpa argumen itu sama dengan envtanpa argumen. Saya cukup yakin sh 'printenv | sort'akan bekerja di DCL atau pipeline dengan skrip.
simon.watts
Telah diuji dan sh 'printenv | sort'ternyata berfungsi untuk pipeline deklaratif Jenkins; fwiw sh 'env | sort'juga berfungsi (Keduanya diuji pada Jenkins ver. 2.46.1). Saya awalnya menyebutkan sh 'printenv'karena direferensikan dalam dokumentasi resmi Jenkins.
Wimateeka
1
Jika Anda kehilangan returnStdout: true maka Anda tidak memerlukan echo; Ini hanya mencetak apa yang sudah dicetak skrip shell.
Ed Randall
26

Karya-karya berikut:

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

Perhatikan bahwa kemungkinan besar ini akan gagal pada eksekusi pertama dan mengharuskan Anda menyetujui berbagai metode menarik untuk dijalankan di jenkins sandbox. Ini dilakukan di "kelola jenkins / persetujuan skrip dalam proses"

Daftar yang saya sertakan:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • BUILD_NUMBER
  • BUILD_TAG
  • BUILD_URL
  • CLASSPATH
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • NAMA PEKERJAAN
  • JOB_URL
Omri Spector
sumber
1
Ini tidak berhasil:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
Oktavianus
5
Apakah Anda memastikan untuk memasukkan @NonCPS?
Joe C.
1
Ini adalah jawaban terbaik karena akan bekerja di luar blok node . Terima kasih banyak untuk ini.
Gi0rgi0s
15

Anda dapat mencapai hasil dengan menggunakan sh/ batstep dan readFile:

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

Sayangnya env.getEnvironment()mengembalikan peta variabel lingkungan yang sangat terbatas.

luka5z
sumber
1
sh 'env > env.txt'bekerja dengan baik dan menyertakan variabel lingkungan yang dibuat oleh proses shell. env.getEnvironment()menunjukkan hanya variabel lingkungan himpunan Jenkins yang merupakan bagian dari yang terlihat dalam sh 'env'teknik. Selain itu, diperlukan persetujuan keamanan skrip method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment. The env.each { name, value -> println "Name: $name -> Value $value" }direkomendasikan oleh @Renato @Jayan hanya mencetak Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979
Bagus!!! Mampu mencetak semua env vars membantu saya menemukan bahwa Jenkins 2 menetapkan JOB_BASE_NAME var berisi nama pekerjaan tanpa folder tempat tinggalnya.
Bill Agee
versi yang bekerja pada windows akan menjadi luar biasa juga :)
Bas Hamer
@Bas Hamer untuk versi windows coba ganti "sh" dengan "bat"
Sebastien
2
Memberi saya kesalahan java.lang.UnsupportedOperationException: Memanggil java.lang.Object statis publik org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) pada penutupan yang diubah CPS tidak belum didukung (JENKINS-26481); merangkum dalam metode @NonCPS, atau menggunakan loop bergaya Java
Ben Mathews
12

Mengapa semua kerumitan ini?

sh 'env'

melakukan apa yang Anda butuhkan (di bawah * nix)

Andrey Regentov
sumber
Ini membutuhkan blok node untuk dieksekusi. Untuk kasus penggunaan saya, saya perlu memproses lingkungan apa yang akan dimiliki node kemudian memutar node berdasarkan kriteria tertentu.
Bill Warner
10

Berikut skrip cepat yang dapat Anda tambahkan sebagai tugas pipeline untuk mencantumkan semua variabel lingkungan:

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

Ini akan mencantumkan variabel sistem dan Jenkins.

Daniel
sumber
9

Cara lintas platform untuk mencantumkan semua variabel lingkungan:

if (isUnix()) {
    sh env
}
else {
    bat set
}
Terry
sumber
7

Saya menggunakan plugin Blue Ocean dan tidak suka setiap entri lingkungan mendapatkan bloknya sendiri. Saya ingin satu blok dengan semua garis.

Mencetak dengan buruk:

sh 'echo `env`'

Mencetak dengan buruk:

sh 'env > env.txt'
for (String i : readFile('env.txt').split("\r?\n")) {
    println i
}

Mencetak dengan baik:

sh 'env > env.txt'
sh 'cat env.txt'

Mencetak dengan baik: (seperti yang disebutkan oleh @mjfroehlich)

echo sh(script: 'env', returnStdout: true)
Jon Lauridsen
sumber
3

Jawaban di atas, sekarang sudah kuno karena sintaks pipeline baru. Di bawah ini mencetak variabel lingkungan.

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

        for(String vars: envs){
            println(vars)
        }
    }
Eddie
sumber
1
1. Anda harus memilikinya di blok skrip. 2. Mereka mendepresiasi lingkaran 'gaya groovy'.
Eddie
Dengan forpenutupan juga akan menyebabkan masalah tanpa @NonCPSanotasi.
menarik
2

The Groovy murni solusi yang membaca global envvariabel tidak mencetak semua variabel lingkungan (misalnya mereka yang hilang variabel dari environmentblok, dari withEnvkonteks dan sebagian besar variabel mesin-spesifik dari OS). Menggunakan langkah-langkah shell dimungkinkan untuk mendapatkan set yang lebih lengkap, tetapi itu membutuhkan nodekonteks, yang tidak selalu diinginkan.

Berikut ini solusi yang menggunakan getContextlangkah untuk mengambil dan mencetak set lengkap variabel lingkungan, termasuk parameter pipeline, untuk konteks saat ini.

Peringatan: Tidak berfungsi di kotak pasir Groovy. Anda dapat menggunakannya dari perpustakaan bersama tepercaya.

def envAll = getContext( hudson.EnvVars )
echo envAll.collect{ k, v -> "$k = $v" }.join('\n')
zett42
sumber
1

jika Anda benar-benar ingin mengulang envdaftar, lakukan saja:

def envs = sh(returnStdout: true, script: 'env').split('\n')
envs.each { name  ->
    println "Name: $name"
}
dsaydon
sumber
0

cara lain untuk mendapatkan hasil yang persis seperti yang disebutkan dalam pertanyaan:

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

Ini dapat dengan mudah diperluas untuk membuat peta dengan subset env vars yang cocok dengan kriteria:

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}
Roma
sumber
0

Saya kira Anda memerlukannya dalam bentuk skrip, tetapi jika orang lain hanya ingin melihat GUI Jenkins, daftar itu dapat ditemukan dengan memilih bagian "Variabel Lingkungan" di menu kiri kontekstual setiap build Select project = > Pilih build => Variabel Lingkungan

masukkan deskripsi gambar di sini

claudod.dll
sumber
2
Ini tidak selalu tersedia.
shuckc
1
Saya tidak berpikir itu tersedia untuk Jenkinsfiles sama sekali. Tangkapan layar terlihat seperti bangunan gaya bebas.
Jakub Bochenski
0

Saya menemukan ini adalah cara termudah:

pipeline {
    agent {
        node {
            label 'master'
        }
    }   
    stages {
        stage('hello world') {
            steps {
                sh 'env'
            }
        }
    }
}
Prosenjit Sen
sumber
-1

Anda bisa mendapatkan semua variabel dari instance jenkins Anda. Kunjungi saja:

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / pipeline-syntax / globals
Dmitriy Tarasevich
sumber