2014-12-16 26 views
13

Tập lệnh không lặp qua tất cả các giá trị của mảng 'mô-đun'.Groovy .each chỉ lặp lại một lần

class Module { 
    public String name = ''; 
    public Boolean isCustom = false; 
    public Module(String name, Boolean custom){ 
     this.name = name; 
     this.isCustom = custom; 
    } 
} 

//creates array from the ext_module env var 
modules = []; 
EXT_MODULE.split(',').each { 
    modules.add(new Module(it, false)); 
} 


println modules; 
modules.each { 
    println "MODULE NAME ::::: ${it.name}" 
    if(it.isCustom) 
    { 
     println "install custom"; 
    } else { 
     println "install non custom"; 
    } 
}; 

Đây là kết quả của quá trình chạy. Mảng hiển thị 4 phần tử, nhưng mã bên trong .each màu đen chỉ thực hiện một lần.

Chạy: In nhắn [Lớp @ 71f09325, Module @ e1ddb41, Module @ 7069a674, Module @ 1f68f952]
Chạy: In nhắn PHẦN TÊN ::::: puppetlabs-NTP
Chạy: In tin cài đặt không tùy chỉnh
Chạy: Kết thúc Workflow
Finished: SUCCESS

+0

Điều này dường như là một vấn đề cụ thể Jenkins DSL. Đối với bất cứ lý do gì nó hoạt động nếu bạn thay đổi modules.each => cho (module trong module), bất cứ ai có thể cho tôi biết lý do tại sao? –

+6

chỉ như vậy: 'def modules = EXT_MODULE.split (','). Thu thập {new Module (it, false)}'. mỗi khi bạn sử dụng 'mỗi' để xây dựng bộ sưu tập, một con mèo chết. thực tế, rằng không có 'def' là ok với jenkins (-scriptler); bạn không rối tung với một số nhà nước toàn cầu ở đây? – cfrick

+0

Tôi đoán là có một số loại đóng cửa toàn cầu bị ảnh hưởng bởi .each và đang làm rối tung quá trình xây dựng Jenkins –

Trả lời

4

Cách giải quyết đơn giản là sử dụng trường cũ cho vòng lặp (code below). Ngoài ra, NonCPS là một cách giải quyết khác. Có một vấn đề mở cho vấn đề này. Xem ở đây: https://issues.jenkins-ci.org/browse/JENKINS-26481

Update, 24 tháng 10 năm 2016

/** * Dumps môi trường varibles vào nhật ký, sử dụng một trường học cũ cho vòng lặp. */

import com.cloudbees.groovy.cps.NonCPS 

def version = '1.0' 

@NonCPS 
def dumpEnvVars() { 
    def str = "Dumping build environment variables...\n" 
    for (Map.Entry<String, String> entry : currentBuild.build().environment) { 
    str += " ${entry.key} = ${entry.value}\n" 
    } 
    echo str 
} 

return this; 
+1

Bạn có thể cải thiện câu trả lời của mình bằng cách cung cấp ví dụ về "trường học cũ cho vòng lặp". –

0

Tính đến ngày hôm qua, các plugin đường ống mới được giao trong phiên bản 2.0 và sửa chữa vấn đề này.

.each đóng cửa hiện đang hoạt động, nhưng .collect vẫn chỉ lặp lại một lần.

+1

Tôi đang sử dụng Jenkins 2.x và tất cả các plugin đường ống của tôi là 2.x, ngoại trừ plugin quan trọng. Tuy nhiên, mỗi() lặp lại chỉ một lần. –

+1

Họ đã quay trở lại và chuyển tiếp với triển khai này. Nhưng tôi nghĩ nó không hoạt động vào lúc này, và cuối cùng tôi đã từ bỏ nó. –

+1

Tương tự như vậy tôi có mọi thứ ở 2.0 hoặc tốt hơn và.mỗi lần lặp lại chỉ một lần (cũng như mọi thứ khác tôi đã thử) –

0

Chú thích NonCPS hoạt động cho tôi trong bước thư viện của tôi. Cũng giống như vậy:

import com.cloudbees.groovy.cps.NonCPS 

@NonCPS 
def call(ary) { 
    ary.each { 
    it.whatever 
    } 

}

+0

có một giải pháp thay thế bằng cách thay đổi thành: 'arry.each {print it}' đến 'for (int i; i Joey

Các vấn đề liên quan