2016-05-06 21 views
5

Tôi đã tạo một đường ống Jenkins mới. Đường ống dẫn (hiện tại) được parametrized với một tùy chọn boolean duy nhất có tên là VAR_A. kịch bản đường ống của tôi là:Vượt qua Jenkins xây dựng các tham số cho các nút đường ống

node ('windows') { 
    echo "$VAR_A" 
    bat 'env' 
} 

Khi tôi tự xây dựng dự án với VAR_A kiểm tra, "true" được lặp lại, như mong đợi. Tuy nhiên, danh sách biến môi trường không hiển thị VAR_A=true.

tôi có thể có được env để hiển thị VAR_A nếu tôi quấn cuộc gọi trong một khối withEnv:

node ('windows') { 
    echo "$VAR_A" 
    withEnv(["VAR_A=$VAR_A"]) { 
     bat 'env' 
    } 
} 

tôi sẽ thông số hơn này, vì vậy xác định từng thông số cá nhân không mong muốn. Có cách nào để chuyển tất cả các tham số xây dựng sang môi trường của nút không?

Trả lời

8

Vấn đề ở chỗ là trong các kịch bản đường ống, các tham số công việc không được tiêm vào môi trường tự động như đối với các công việc thông thường. Mỗi tham số trở thành một biến của kịch bản Pipeline binding. Do đó bạn có thể truy cập chúng trực tiếp theo tên.

Trong ví dụ của bạn echo "$VAR_A" thay thế biến được thực hiện bởi groovy trong ngữ cảnh của tập lệnh của bạn (xem Groovy doc on strings interpolation). Đó là lý do tại sao bạn không nhìn thấy nó trong đầu ra bat.

Đối với mỗi thông số bạn muốn tiêm, bạn cần phải thêm một dòng như sau: env.VAR_A = VAR_A khi bắt đầu tập lệnh. Nó có thể nằm ngoài khối nodeenv là toàn cầu trong toàn bộ tập lệnh.

Ngoài ra, có một cách để thêm tất cả các vars tập lệnh, bao gồm các tham số và thậm chí cả các đường tích hợp sẵn đường ống, tức là steps vào môi trường. Đáng tiếc là nó sẽ yêu cầu một số danh sách trắng để chạy trong một sandbox:

@NonCPS 
def populateEnv(){ binding.variables.each{k,v -> env."$k" = "$v"} } 
populateEnv() 

Ví dụ: VAR_A là một tham số. Script cơ thể:

def AAAA = 1 // such a definition doesn't put variable in the binding 
BBBB = 2  // creates a binding variable. Absolutely the same behavior as for a job parameter. 

@NonCPS 
def populateEnv(){ binding.variables.each{k,v -> env."$k" = "$v"} } 
populateEnv() // at this point injection happens 

CCCC = 3  // created after the injection hence it won't appear in env. 
node ('windows') { 
    bat 'env' 
} 

Trong bat đầu ra bạn sẽ tìm thấy VAR_ABBBB.

IMO trừ khi công việc của bạn có hàng chục thông số được xác định env.VAR_A = VAR_A cách tiếp cận được ưa thích đơn giản hơn, đơn giản hơn và không yêu cầu phê duyệt.

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