จะแสดงรายการคุณสมบัติ "env" ทั้งหมดภายในงานท่อเจนกินส์ได้อย่างไร


106

ด้วยการสร้างไปป์ไลน์เจนกินส์ 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/…
Krzysztof Krasoń

3
Afaik env เพียงแค่ห่อหุ้มตัวแปรสภาพแวดล้อม ฉันไม่คิดว่าคุณจะวนซ้ำได้ ลอง 'sh env' บน linux / 'bat set' บน windows
Dominik Gebhart

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

คำตอบ:


87

อีกวิธีที่กระชับกว่านี้:

node {
    echo sh(returnStdout: true, script: 'env')
    // ...
}

cf. 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 | sort 'เพราะมันทำให้ฉันแทบคลั่งที่มันไม่ได้เรียงลำดับตามคีย์
Jeff Hutton

84

ตามเอกสารของ Jenkinsสำหรับไปป์ไลน์ที่เปิดเผย :

sh 'printenv'

สำหรับไปป์ไลน์ที่เขียนสคริปต์ Jenkins :

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

ข้างต้นยังจัดประเภท env vars ของคุณเพื่อความสะดวก


2
printenvเป็นเพียงคำสั่งเชลล์ที่พิมพ์สภาพแวดล้อมโดยไม่มีอะไรเฉพาะเจาะจงสำหรับเจนกินส์ โดยไม่มีข้อโต้แย้งจะเทียบเท่ากับการenvไม่มีข้อโต้แย้ง ฉันค่อนข้างแน่ใจว่าsh 'printenv | sort'จะทำงานใน DCL หรือไปป์ไลน์แบบสคริปต์
simon.watts

ผ่านการทดสอบและsh 'printenv | sort'ใช้งานได้จริงสำหรับไปป์ไลน์ประกาศของเจนกินส์ fwiw sh 'env | sort'ยังใช้งานได้ (ทั้งสองทดสอบกับ Jenkins เวอร์ชั่น 2.46.1) ตอนแรกฉันพูดถึงsh 'printenv'เพราะอ้างอิงในเอกสารของเจนกินส์อย่างเป็นทางการ
Wimateeka

1
หากคุณสูญเสีย returnStdout: true คุณไม่ต้องการเสียงสะท้อน เป็นเพียงการพิมพ์สิ่งที่เชลล์สคริปต์พิมพ์ไปแล้ว
Ed Randall

27

ผลงานดังต่อไปนี้:

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

โปรดทราบว่าส่วนใหญ่อาจล้มเหลวในการดำเนินการครั้งแรกและต้องการให้คุณอนุมัติวิธีการที่หลากหลายเพื่อให้ทำงานในแซนด์บ็อกซ์เจนกินส์ สิ่งนี้ทำได้ใน "จัดการ jenkins / การอนุมัติสคริปต์ในกระบวนการ"

รายการที่ฉันได้รับ:

  • 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
  • JOB_NAME
  • JOB_URL

1
สิ่งนี้ใช้ไม่ได้:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
octavian

5
คุณแน่ใจว่าได้รวม@NonCPS?
Joe C.

1
นี่คือคำตอบที่ดีที่สุดเพราะมันจะทำงานนอกโหนดบล็อก ขอบคุณมากสำหรับสิ่งนี้
Gi0rgi0s

15

คุณสามารถบรรลุผลลัพธ์โดยใช้sh/ batstep และreadFile:

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

น่าเสียดายที่env.getEnvironment()ส่งคืนแผนที่ตัวแปรสภาพแวดล้อมที่ จำกัด มาก


2
sh 'env > env.txt'ทำงานได้ดีและรวมถึงตัวแปรสภาพแวดล้อมที่สร้างโดยกระบวนการเชลล์ env.getEnvironment()แสดงเฉพาะตัวแปรสภาพแวดล้อมชุด Jenkins ซึ่งเป็นส่วนย่อยที่เห็นใน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 var ที่มีชื่องานอยู่ในโฟลเดอร์ที่อยู่
Bill Agee

เวอร์ชันที่ใช้งานได้บน windows ก็น่ากลัวเช่นกัน :)
Bas Hamer

@Bas Hamer สำหรับเวอร์ชัน windows พยายามแทนที่ "sh" โดย "bat"
Sebastien

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)


สิ่งนี้ต้องใช้โหนดบล็อกเพื่อดำเนินการ สำหรับกรณีการใช้งานของฉันฉันจำเป็นต้องประมวลผลสภาพแวดล้อมที่โหนดจะมีจากนั้นจึงหมุนโหนดตามเกณฑ์ที่กำหนด
Bill Warner

10

นี่คือสคริปต์ด่วนที่คุณสามารถเพิ่มเป็นงานไปป์ไลน์เพื่อแสดงรายการตัวแปรสภาพแวดล้อมทั้งหมด:

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

สิ่งนี้จะแสดงรายการตัวแปรทั้งระบบและเจนกินส์



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. พวกเขากำลังลดคุณค่าของลูป 'สไตล์ที่น่าสนใจ'
Eddie

การforปิดจะทำให้เกิดปัญหาหากไม่มี@NonCPSคำอธิบายประกอบ
วาด

3

Groovy บริสุทธิ์โซลูชั่นที่อ่านทั่วโลกenvตัวแปรไม่ได้พิมพ์ตัวแปรสภาพแวดล้อมทั้งหมด (เช่นพวกเขาจะหายตัวแปรจากenvironmentบล็อกจากwithEnvบริบทและส่วนใหญ่ของตัวแปรเฉพาะของเครื่องจากระบบปฏิบัติการ) การใช้เชลล์ขั้นตอนเป็นไปได้ที่จะได้ชุดที่สมบูรณ์ยิ่งขึ้น แต่ต้องใช้ไฟล์nodeบริบทซึ่งไม่ต้องการเสมอไป

นี่คือโซลูชันที่ใช้getContextขั้นตอนในการดึงและพิมพ์ชุดตัวแปรสภาพแวดล้อมที่สมบูรณ์รวมถึงพารามิเตอร์ไปป์ไลน์สำหรับบริบทปัจจุบัน

Caveat:ไม่ทำงานใน Groovy sandbox คุณสามารถใช้งานได้จากไลบรารีที่ใช้ร่วมกันที่เชื่อถือได้

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

ฉันคิดว่าคุณต้องการสิ่งนั้นในรูปแบบของสคริปต์ แต่ถ้ามีคนอื่นแค่ต้องการดู Jenkins GUI รายการนั้นสามารถพบได้โดยการเลือกส่วน "ตัวแปรสภาพแวดล้อม" ในเมนูด้านซ้ายตามบริบทของทุกโครงการเลือกโครงการ = > เลือก build => ตัวแปรสภาพแวดล้อม

ป้อนคำอธิบายภาพที่นี่


2
สิ่งนี้ไม่สามารถใช้ได้เสมอไป
shuckc

2
ฉันไม่คิดว่ามันมีให้สำหรับ Jenkinsfiles เลย ภาพหน้าจอดูเหมือนงานสร้างแบบฟรีสไตล์
Jakub Bochenski

0

ฉันพบว่านี่เป็นวิธีที่ง่ายที่สุด:

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

-1

คุณสามารถรับตัวแปรทั้งหมดจากอินสแตนซ์เจนกินส์ของคุณ เพียงเยี่ยมชม:

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / pipeline-syntax / globals
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.