Jenkins pipeline job içindeki tüm "env" özellikleri nasıl listelenir?


106

Bir Jenkins 2.1 build boru hattı, Jenkins enjekte eden bir Verilen enviçine değişken node{}. Örneğin, BRANCH_NAMEile erişilebilir

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

Jenkins ardışık düzenindeki tüm env özellikleri yankılamak istiyorum

... tüm özellikleri önceden bilmediğimi düşünürsek .

Gibi kod arıyorum

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

böyle bir şeyi yankılanan

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

env bir haritadır. Normal yinelemeyi denediniz mi? like - env.each {println it}
Jayan


3
Afaik env sadece ortam değişkenlerini kapsamaktadır. Bunun üzerinden geçebileceğini sanmıyorum. Linux'ta 'sh env' / Windows'ta 'bat set' deneyin.
Dominik Gebhart

1
@Renato @Jayan aşağıdaki yorum başına env.each { name, value -> println "Name: $name -> Value $value" }baskılar Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979

1
@ JamesThomasMoon1979 Bunun nedeni, Pipeline'ın Groovy kapanışlarını kırmasıdır. Eğer eski Java stilini düzeltirseniz (yani new ClassName() { ... }) çalışmalıdır. Veya etiketlenmiş bir yöntemde çalıştırırsanız @NonCPS, kapanışlar da bunun içinde çalışacaktır.
Daniel C. Sobral

Yanıtlar:



82

Göre Jenkins belgelerine için bildirim boru hattı :

sh 'printenv'

Jenkins komut dosyalı ardışık düzen için :

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

Yukarıdakiler, kolaylık sağlamak için ortam değişkenlerinizi de sıralar.


1
printenvsadece çevreyi yazdıran bir kabuk komutudur, Jenkins'e özgü değildir. Bağımsız değişkenler olmadan, bağımsız değişkenler olmadan eşdeğerdir env. Eminim sh 'printenv | sort'DCL'de veya komut dosyalı ardışık düzenlerde çalışacaktır.
simon.watts

sh 'printenv | sort'Jenkins bildirimsel ardışık düzeninde test edildi ve çalışıyor aslında; fwiw sh 'env | sort'de çalışır (Her ikisi de Jenkins ver. 2.46.1'de test edilmiştir). İlk sh 'printenv'olarak, resmi Jenkins belgelerinde referans verildiği için bahsetmiştim .
Wimateeka

1
ReturnStdout: true değerini kaybederseniz, yankıya ihtiyacınız yoktur; Sadece kabuk betiğinin zaten yazdırdığı şeyi yazdırıyor.
Ed Randall

26

Aşağıdaki işler:

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

Büyük olasılıkla ilk çalıştırmada başarısız olacağını ve jenkins korumalı alanında çalıştırmak için çeşitli harika yöntemleri onaylamanızı gerektireceğini unutmayın. Bu, "jenkins'i yönet / işlem içi komut dosyası onayı" bölümünde yapılır

Dahil ettiğim liste:

  • BUILD_DISPLAY_NAME
  • BUILD_ID
  • YAPI NUMARASI
  • BUILD_TAG
  • BUILD_URL
  • CLASSPATH
  • HUDSON_HOME
  • HUDSON_SERVER_COOKIE
  • HUDSON_URL
  • JENKINS_HOME
  • JENKINS_SERVER_COOKIE
  • JENKINS_URL
  • JOB_BASE_NAME
  • İŞ ADI
  • JOB_URL

1
Bu işe yaramıyor:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
octavian

5
Eklediğinizden emin misiniz @NonCPS?
Joe C.

1
Bu en iyi cevaptır çünkü bir düğüm bloğunun dışında çalışacaktır . Bunun için çok teşekkürler.
Gi0rgi0s

15

Sonucu sh/ batstep kullanarak ve readFile:

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

Ne yazık ki env.getEnvironment(), çok sınırlı ortam değişkenleri haritası döndürür.


2
sh 'env > env.txt'iyi çalışır ve kabuk işlemi tarafından oluşturulan ortam değişkenlerini içerir. env.getEnvironment()sadece sh 'env'teknikte görülenlerin bir alt kümesi olan Jenkins set ortam değişkenlerini gösterir . Ayrıca, komut dosyası güvenlik onayına ihtiyacı var method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment. env.each { name, value -> println "Name: $name -> Value $value" }@Renato @Jayan tarafından tavsiye yalnızca yazdırır Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979

Güzel!!! Tüm ortam değişkenlerini yazdırabilmek, Jenkins 2'nin bir JOB_BASE_NAME değişkeninin, içinde yaşadığı klasörden iş adını içerdiğini keşfetmeme yardımcı oldu.
Bill Agee

Pencerelerde çalışan bir versiyonu :) sıra harika olurdu
Bas Hamer

Windows sürümü için @Bas Hamer, "sh" yerine "bat" koymayı deneyin
Sebastien

2
Bana bir hata veriyor java.lang.UnsupportedOperationException: Genel statik java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) çağrısı CPS dönüştürülmüş bir kapatmada değil henüz destekleniyor (JENKINS-26481); @NonCPS yöntemini kapsülleyin veya Java tarzı döngüler kullanın
Ben Mathews

12

Neden tüm bu karmaşıklık?

sh 'env'

ihtiyacın olanı yapar (* nix altında)


Bu, yürütülmesi için bir düğüm bloğu gerektirir. Kullanım durumum için, düğümün hangi ortama sahip olacağını işlemem ve ardından belirli kriterlere göre bir düğümü döndürmem gerekiyor.
Bill Warner

10

İşte tüm ortam değişkenlerini listelemek için bir ardışık düzen işi olarak ekleyebileceğiniz hızlı bir komut dosyası:

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

Bu hem sistem hem de Jenkins değişkenlerini listeleyecektir.


9

Tüm ortam değişkenlerini listelemenin çapraz platform yolu:

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

7

Blue Ocean eklentisini kullanıyorum ve her ortam girişinin kendi bloğunu almasını beğenmedim. İstediğim biriniTüm çizgilerle blok .

Kötü yazdırıyor:

sh 'echo `env`'

Kötü yazdırıyor:

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

İyi yazdırır:

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

İyi yazdırır: (@mjfroehlich tarafından belirtildiği gibi)

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

3

Yukarıdaki cevaplar, yeni ardışık düzen sözdizimi nedeniyle artık modası geçmiş durumda. Aşağıda ortam değişkenlerini yazdırır.

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

        for(String vars: envs){
            println(vars)
        }
    }

1
1. Bir komut dosyası bloğunda olması gerekir. 2. 'Harika stil' döngüsünü değer kaybediyorlar.
Eddie

forBir kapakla da olmadan sorunlara neden olacaktır @NonCPSaçıklama.
17:35

3

Saf Groovy küresel okumak çözümler envtüm ortam değişkenleri yazdırmak yok değişkeni (örneğin onlar değişkenleri eksik environmentgelen bloğun withEnvbağlam ve OS makine özgü değişkenlerin çoğu). Kabuk adımlarını kullanarak daha eksiksiz bir set elde etmek mümkündür, ancak bu nodeher zaman istenmeyen bir bağlam gerektirir .

Burada, getContextgeçerli bağlam için işlem hattı parametreleri de dahil olmak üzere tüm ortam değişkenlerini almak ve yazdırmak için adımı kullanan bir çözüm bulunmaktadır .

Uyarı: Groovy korumalı alanında çalışmıyor. Yine de güvenilir bir paylaşılan kitaplıktan kullanabilirsiniz.

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

1

envListede gerçekten döngü yapmak istiyorsanız şunu yapın :

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

0

soruda belirtilen çıktıyı tam olarak elde etmenin başka bir yolu:

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

Bu, bir ölçütle eşleşen ortam değişkenlerinin bir alt kümesine sahip bir harita oluşturmak için kolayca genişletilebilir:

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

Sanırım buna bir komut dosyası biçiminde ihtiyacınız vardı, ancak bir başkası yalnızca Jenkins GUI'ye bakmak isterse, bu liste her derlemenin bağlamsal sol menüsünde "Ortam Değişkenleri" bölümü seçilerek bulunabilir. Proje Seç = > Build => Ortam Değişkenlerini seçin

görüntü açıklamasını buraya girin


2
Bu her zaman mevcut değildir.
shuckc

1
Jenkinsfiles için mevcut olduğunu sanmıyorum. Ekran görüntüsü serbest stil yapıya benziyor.
Jakub Bochenski

0

Bunun en kolay yol olduğunu buldum:

pipeline {
    agent {
        node {
            label 'master'
        }
    }   
    stages {
        stage('hello world') {
            steps {
                sh 'env'
            }
        }
    }
}

-1

Jenkins örneğinizden tüm değişkenleri alabilirsiniz. Şu adresi ziyaret edin:

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / pipeline-syntax / globals
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.