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 node
vì env
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_A
và BBBB
.
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.