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
 ...

env adalah peta. Apakah Anda mencoba iterasi normal? seperti - env.each {println it}
Jayan


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.


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

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.


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)


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.


9

Cara lintas platform untuk mencantumkan semua variabel lingkungan:

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

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)

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

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

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

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}

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


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

-1

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

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / pipeline-syntax / globals
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.