2016-07-26 31 views
11

Tôi đang cố gắng sử dụng đường ống DSL trong Jenkins. Tôi nghĩ sẽ tốt hơn nếu tôi có thể sử dụng tên dự án như một phần của kịch bản của tôi.Biến môi trường truy cập đường ống Jenkins

git credentialsId: 'ffffffff-ffff-ffff-ffff-ffffffffffffff',\ 
url: "${repo_root}/${JOB_NAME}.git" 

tôi nhận được lỗi:

groovy.lang.MissingPropertyException: \ 
No such property: JOB_NAME for class: groovy.lang.Binding 

tôi nghĩ rằng tôi đi theo these directions, và họ đề cập JOB_NAME là một trong các biến.

tôi quyết định thử:

sh 'env' 

trong DSL của tôi, và điều này sẽ in ra:

JOB_NAME = foo-bar 

đó là những gì tôi mong đợi.

Một blog mentions:

Usage of environment variables
We have two ways to get their value. The properties passed by -D= during the startup we could read as System.getProperty("key") thanks to the Groovy's strong relation with Java.

Reading normal environment variables in Java way is the System.getenv("VARIABLE") ...

Hãy thử điều này:

println "JOB_NAME = " + System.getenv('JOB_NAME'); 

Bây giờ, tôi nhận được:

java.lang.NullPointerException: Cannot get property 'System' on null object 

đối tượng Null? Nhưng, tôi có thể thấy rằng JOB_NAME là một biến môi trường!

Làm cách nào để đọc trong số $JOB_NAME thành tập lệnh DSL trong công việc Đường ống. Tôi đang cố gắng một công việc đường ống, và khi tôi nhận được rằng làm việc sẽ làm cho một đường ống Multibranch với một Jenkinsfile.

Trả lời

22

Tất cả các biến môi trường đều có thể truy cập được bằng cách sử dụng env, ví dụ: ${env.JOB_NAME}.

+0

đó làm việc. 'JOB_NAME' được đề cập dưới dạng biến Jenkins đặc biệt được cho là đã được xác định. –

2

Thực tế chỉ cần sử dụng ${env.JOB_NAME} để truy cập biến đã biết.

Tuy nhiên, nếu bạn cần truy cập biến môi trường nơi tên được cung cấp bởi một biến khác (truy cập động), chỉ cần sử dụng env["your-env-variable"].

Tôi gặp sự cố khi tôi định cấu hình 3 biến môi trường (trong Jenkins -> Administer -> Configure System -> Environment variables), hãy đặt tên cho chúng là ENV_VAR_1, ENV_VAR_2, ENV_VAR_3. Bây giờ tôi muốn tự động truy cập chúng, tôi có thể làm như vậy:

def envVarName = "ENV_VAR_" + count // Suppose count is initialized in a loop somewhere above... 

def value = env[envVarName] // Will be resolved to env["ENV_VAR_1"] depending on count value 

biến môi trường của tôi trong cấu hình nhìn Jenkins như thế này:

enter image description here

+0

Điều này không hoạt động, chỉ cần kiểm tra nó. Vui lòng cung cấp thêm thông tin chi tiết @ Pom12. –

+0

Tôi hiện đang sử dụng thành công cho các biến môi trường được xác định hệ thống, như tôi hiển thị trong bài đăng đã chỉnh sửa của mình. Bạn đang sử dụng phiên bản Jenkins nào? – Pom12

+1

Nó cũng cho phép thiết lập các biến trực tiếp với 'env [var]'. – meonlol

0

Tôi đã có một vấn đề với điều này không làm việc. Các biến thuộc tính/môi trường được đặt toàn cục chỉ có sẵn trong bước node. Đó là một lỗi trong phiên bản 2.4 của plugin Pipeline. Nâng cấp lên 2.5 nếu bạn gặp sự cố này và các thuộc tính toàn cầu của bạn sẽ có sẵn ở bất kỳ nơi nào trong tập lệnh. Tôi đã đăng bài này lên wiki Jenkins here với tập lệnh thử nghiệm mà tôi đã sử dụng.

3

Được rồi điều này thực sự làm tôi bực mình trong một thời gian hôm nay.Cuối cùng, tôi đã được thực hiện bằng một vài điều:

  • chuỗi đơn trích dẫn trong Groovy có nghĩa là "không đánh giá biến," giống như nó trong bash
  • Sử dụng $ suy là hoàn toàn không cần thiết nếu bạn chỉ tham chiếu biến, vì vậy bạn chỉ có thể thực hiện env.JOB_NAME.

này SO câu hỏi chứng tỏ là một trong đó đã giúp tôi giải mã: Jenkins Workflow Checkout Accessing BRANCH_NAME and GIT_COMMIT

+2

Độc vs dấu ngoặc kép làm tôi day! Điều đó thực sự đã khắc phục được vấn đề của tôi. Cảm ơn rất nhiều! – gvasquez

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