Làm thế nào để liệt kê tất cả các thuộc tính `env` trong công việc đường ống jenkins?


105

Với một đường dẫn xây dựng jenkins 2.1, jenkins đưa một envbiến vào node{}. Ví dụ, BRANCH_NAMEcó thể được truy cập bằng

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

Tôi muốn lặp lại tất cả các env thuộc tính trong đường ống jenkins

... xem xét rằng tôi không biết tất cả tài sản trước thời hạn.

Tôi đang tìm mã như

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

điều đó sẽ lặp lại một cái gì đó giống như

 BRANCH_NAME is myBranch2
 CHANGE_ID is 44
 ...

env là một bản đồ. Bạn đã thử lặp lại bình thường? thích - env.each {println it}
Jayan

3
Có vẻ như một bản sao của stackoverflow.com/questions/36836806/…
Krzysztof Krasoń

3
Afaik env chỉ đóng gói các biến môi trường. Tôi không nghĩ rằng bạn có thể lặp lại nó. Hãy thử 'sh env' trên linux / 'bat set' trên windows.
Dominik Gebhart

1
@Renato @Jayan theo nhận xét của tôi bên dưới, env.each { name, value -> println "Name: $name -> Value $value" }bản in Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979,

1
@ JamesThomasMoon1979 Đó là do Pipeline phá vỡ việc đóng Groovy. Nếu bạn sửa nó theo kiểu Java cũ (nghĩa là new ClassName() { ... }), nó sẽ hoạt động. Hoặc bạn chạy nó trên một phương thức được gắn thẻ @NonCPS, thì các bao đóng cũng sẽ hoạt động bên trong đó.
Daniel C. Sobral,

Câu trả lời:



80

Theo tài liệu Jenkins cho đường ống khai báo :

sh 'printenv'

Đối với đường ống theo tập lệnh Jenkins :

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

Ở trên cũng sắp xếp env vars của bạn để thuận tiện.


1
printenvchỉ là một lệnh shell in ra môi trường, không có gì cụ thể đối với Jenkins. Không có đối số tương đương với envkhông có đối số. Tôi khá chắc chắn sh 'printenv | sort'sẽ hoạt động trong DCL hoặc đường ống theo tập lệnh.
simon.watts

Đã thử nghiệm và sh 'printenv | sort'trên thực tế hoạt động cho một đường ống khai báo Jenkins; fwiw sh 'env | sort'cũng hoạt động (Cả hai đều được thử nghiệm trên Jenkins phiên bản 2.46.1). Tôi đề cập ban đầu sh 'printenv'vì nó được tham chiếu trong tài liệu chính thức của Jenkins.
Wimateeka

1
Nếu bạn mất returnStdout: true thì bạn không cần echo; Nó chỉ in những gì mà shell script đã in.
Ed Randall

26

Các hoạt động sau:

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

Lưu ý rằng nó hầu hết có thể sẽ thất bại trong lần thực thi đầu tiên và yêu cầu bạn chấp thuận các phương thức linh hoạt khác nhau để chạy trong hộp cát jenkins. Điều này được thực hiện trong "quản lý phê duyệt tập lệnh jenkins / trong quá trình"

Danh sách tôi nhận được bao gồm:

  • 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
  • TÊN CÔNG VIỆC
  • JOB_URL

1
Điều này không hoạt động:java.lang.UnsupportedOperationException: each on a CPS-transformed closure is not yet supported
octavian

5
Bạn có đảm bảo bao gồm @NonCPSkhông?
Joe C.

1
Đây là câu trả lời tốt nhất vì nó sẽ hoạt động bên ngoài một khối nút . Cảm ơn rất nhiều vì điều này.
Gi0rgi0s

15

Bạn có thể hoàn thành kết quả bằng cách sử dụng sh/ batstep và readFile:

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

Thật không may, env.getEnvironment()trả về rất hạn chế bản đồ các biến môi trường


1
sh 'env > env.txt'hoạt động tốt và bao gồm các biến môi trường được tạo bởi quá trình shell. env.getEnvironment()chỉ hiển thị các biến môi trường tập hợp Jenkins là một tập hợp con của biến môi trường được thấy trong sh 'env'kỹ thuật. Ngoài ra, nó cần phê duyệt bảo mật tập lệnh method org.jenkinsci.plugins.workflow.support.actions.EnvironmentAction getEnvironment. Các env.each { name, value -> println "Name: $name -> Value $value" }khuyến cáo của @Renato @Jayan chỉ in Name: org.jenkinsci.plugins.workflow.cps.EnvActionImpl@45c2d1ee -> Value null.
JamesThomasMoon1979,

Đẹp!!! Có khả năng in tất cả env VAR đã giúp tôi khám phá ra rằng Jenkins 2 bộ một var JOB_BASE_NAME chứa sans tên công việc thư mục nó sống ở.
Bill Agee

một phiên bản hoạt động trên cửa sổ sẽ được awesome cũng :)
Bas Hamer

@Bas Hamer cho một phiên bản cửa sổ cố gắng thay thế "sh" bởi "dơi"
Sebastien

2
Cung cấp cho tôi lỗi java.lang.UnsupportedOperationException: Gọi công khai tĩnh java.lang.Object org.codehaus.groovy.runtime.DefaultGroovyMethods.each (java.lang.Object, groovy.lang.Closure) trên một bao đóng được chuyển đổi CPS thì không chưa được hỗ trợ (JENKINS-26481); gói gọn trong một phương pháp @NonCPS, hoặc sử dụng vòng Java-style
Ben Mathews

12

Tại sao tất cả sự phức tạp này?

sh 'env'

làm những gì bạn cần (dưới * nix)


Điều này yêu cầu một khối nút để thực thi. Đối với trường hợp sử dụng của tôi, tôi cần xử lý môi trường mà nút sẽ có sau đó xoay nút lên dựa trên các tiêu chí nhất định.
Bill Warner

10

Đây là một tập lệnh nhanh mà bạn có thể thêm làm công việc đường ống để liệt kê tất cả các biến môi trường:

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

Điều này sẽ liệt kê cả biến hệ thống và biến Jenkins.


9

Cách đa nền tảng để liệt kê tất cả các biến môi trường:

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

7

Tôi sử dụng plugin Blue Ocean và không thích mỗi mục nhập môi trường nhận được khối riêng của nó. Tôi muốn một khối với tất cả các dòng.

In kém:

sh 'echo `env`'

In kém:

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

In tốt:

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

In tốt: (như đã đề cập bởi @mjfroehlich)

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

3

Các câu trả lời ở trên, hiện đã bị lỗi thời do cú pháp đường ống mới. Dưới đây in ra các biến môi trường.

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

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

1
1. Bạn cần có nó trong một khối script. 2. Họ đang giảm giá trị vòng lặp 'phong cách thú vị'.
Eddie

Với formột đóng cũng sẽ gây ra sự cố mà không có @NonCPSchú thích.
ảm đạm

2

Các giải pháp Groovy thuần túy đọc envbiến toàn cục không in ra tất cả các biến môi trường (ví dụ như chúng bị thiếu các biến từ environmentkhối, từ withEnvngữ cảnh và hầu hết các biến dành riêng cho máy từ Hệ điều hành). Sử dụng các bước shell có thể có được một tập hợp hoàn chỉnh hơn, nhưng điều đó đòi hỏi một nodebối cảnh, điều này không phải lúc nào cũng muốn.

Đây là một giải pháp sử dụng getContextbước để truy xuất và in toàn bộ tập hợp các biến môi trường, bao gồm cả các tham số đường ống, cho ngữ cảnh hiện tại.

Lưu ý: Không hoạt động trong hộp cát Groovy. Bạn có thể sử dụng nó từ một thư viện được chia sẻ đáng tin cậy.

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

1

nếu bạn thực sự muốn lặp lại envdanh sách chỉ cần làm:

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

0

một cách khác để lấy chính xác đầu ra được đề cập trong câu hỏi:

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

Điều này có thể dễ dàng được mở rộng để xây dựng một bản đồ với một tập hợp con các env vars phù hợp với tiêu chí:

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

Tôi cho rằng bạn cần điều đó ở dạng tập lệnh, nhưng nếu ai đó chỉ muốn xem qua Jenkins GUI, danh sách đó có thể được tìm thấy bằng cách chọn phần "Biến môi trường" trong menu bên trái theo ngữ cảnh của mọi bản dựng Chọn dự án = > Chọn bản dựng => Biến môi trường

nhập mô tả hình ảnh ở đây


2
Điều này không phải lúc nào cũng có sẵn.
shuckc

1
Tôi không nghĩ rằng nó có sẵn cho Jenkinsfiles cả. Ảnh chụp màn hình trông giống như một bản dựng tự do.
Jakub Bochenski

0

Tôi thấy đây là cách dễ nhất:

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

-1

Bạn có thể lấy tất cả các biến từ phiên bản jenkins của mình. Chỉ cần truy cập:

  • $ {jenkins_host} /env-vars.html
  • $ {jenkins_host} / đường ống-cú pháp / toàn cầu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.