Jenkins - chuyển các biến giữa các công việc?


87

Tôi có hai công việc trong jenkins, cả hai đều cần cùng một tham số.

Làm cách nào tôi có thể chạy công việc đầu tiên với một tham số để khi nó kích hoạt công việc thứ hai, cùng một tham số được sử dụng?


Chúng ta có thể sử dụng rất nhiều cách: Một cách tốt nhất là sử dụng các thông số công việc hiện tại, Hoặc sử dụng được xác định trước các thông số trong công việc xuôi cò
KSR

1
Tiêu đề này thật khó hiểu. Làm thế nào là "chuyển các biến giữa các công việc?". Câu trả lời cũng được chấp nhận là một plugin. Ưa thích mà!
Rakib

Câu trả lời:


73

Bạn có thể sử dụng Trình cắm kích hoạt tham số cho phép bạn chuyển các tham số từ nhiệm vụ này sang tác vụ khác.

Bạn cũng cần thêm thông số này mà bạn đã truyền từ ngược dòng xuống hạ lưu.


10
Xin chào, xin lỗi vì nghe có vẻ giống như một noob, nhưng liệu ai đó có thể chỉnh sửa điều này với chi tiết về cách thực hiện với Trình kích hoạt tham số không?
Fadi

10
Lưu ý bên: Có vẻ như các biến môi trường đã xuất được tạo trong các phần tập lệnh bash đủ điều kiện để thay thế trong các tham số đầu ra (ví dụ: 'export VERSION' sẽ không làm cho 'UPSTREAM_VERSION = $ VERSION' nhận giá trị chính xác; nó chỉ nhận được '$ VERSION' thay thế).
Mark McKenna

21
Câu trả lời này là không đủ
tarabyte

6
Tôi đồng ý rằng nên có một số loại ví dụ về cách truyền các tham số cho công việc mục tiêu. Trang Plugin trình kích hoạt tham số hiện tại không cung cấp thông tin tốt về điều này. Có thể có ví dụ như loại cú pháp bạn nên sử dụng để chuyển các tham số.
skrii

2
Plugin dường như không hoạt động nữa. Xem danh sách dài các vấn đề đang mở . Tôi không thể chuyển bất kỳ giá trị tham số nào với plugin này nữa. Bất kỳ giải pháp nào khác?
Markus L

38

1.Post-Build Actions> Chọn "Kích hoạt bản dựng được tham số hóa trên các dự án khác"

2.Nhập biến môi trường với giá trị. Giá trị cũng có thể là Tham số xây dựng Jenkins.

Các bước chi tiết có thể xem tại đây: -

https://itisatechiesworld.wordpress.com/jenkins-osystem-articles/jenkins-configuration/jenkins-passing-a-parameter-from-one-job-to-aosystem/

Hy vọng nó hữu ích :)


Câu trả lời này thỏa mãn câu hỏi OP đặt ra mà không yêu cầu plugin hoặc sử dụng DSL.
BTC

8
FYI, câu trả lời này vẫn cần plugin.
Thomas Lee,

Plugin tuyệt vời khi nhưng nó không thể chuyển các giá trị biến được đặt trong các phần lệnh shell thực thi.
Tara Prasad Gurung

25

Các câu trả lời được chấp nhận ở đây không làm việc đối với trường hợp sử dụng của tôi. Tôi cần có khả năng tạo động các tham số trong một công việc và chuyển chúng vào một công việc khác. Như Mark McKenna đề cập, dường như không có cách nào để xuất một biến từ bước xây dựng trình bao sang các hành động xây dựng bài đăng.

Tôi đã đạt được giải pháp thay thế bằng cách sử dụng Plugin trình kích hoạt tham số bằng cách ghi các giá trị vào tệp và sử dụng tệp đó làm tham số để nhập thông qua 'Thêm hành động sau xây dựng' -> 'Bản dựng tham số kích hoạt ...' rồi chọn 'Thêm thông số' - > 'Tham số từ tệp thuộc tính'.


Đây là những gì tôi cần. Cảm ơn.
luckytaxi

Nếu bạn sẵn sàng sử dụng đường ống jenkins 2.x, bạn có thể sử dụng writeFile / stash-> unsash / readFile để sao chép dữ liệu trạng thái giữa các công việc. slideshare.net/ericlongtx/… Kiểm tra slide 21 để làm ví dụ.
ngủ trưa

Điều này là bắt buộc nếu bạn muốn các biến SHELL đi qua. Rất nhiều đánh giá cao cho câu trả lời này.
Carl Wainwright

17

Tôi nghĩ câu trả lời ở trên cần một số cập nhật:

Tôi đang cố tạo một thư mục động để lưu trữ các tạo tác bản dựng ngược dòng của mình, vì vậy tôi muốn chuyển số bản dựng công việc ngược dòng của mình sang công việc hạ lưu, tôi đã thử các bước trên nhưng không thể hoạt động. Đây là cách nó hoạt động:

  1. Tôi đã sao chép các tạo tác từ công việc hiện tại của mình bằng cách sử dụng plugin sao chép tạo tác.
  2. Trong hành động tạo bài đăng của công việc ngược dòng, tôi đã thêm biến như "SOURCE_BUILD_NUMBER = $ {BUILD_NUMBER}" và định cấu hình biến này để kích hoạt công việc xuống.
  3. Mọi thứ đều hoạt động ngoại trừ công việc cuối cùng của tôi không thể nhận được $ SOURCE_BUILD_NUMBER để tạo thư mục.
  4. Vì vậy, tôi phát hiện ra rằng để sử dụng biến này, tôi phải xác định cùng một biến trong công việc luồng xuống dưới dạng một biến tham số như trong hình dưới đây:

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

Điều này là do phiên bản jenkins mới cũng yêu cầu bạn xác định biến trong công việc hạ lưu. Tôi hy vọng nó hữu ích.


Hoàn toàn đồng ý. Đây là bản cập nhật bắt buộc hoàn thành 100% câu trả lời ban đầu.
CodeSlave

10

(dành cho các googlers đồng nghiệp)

Nếu bạn đang xây dựng một đường dẫn nghiêm túc với Plugin luồng xây dựng , bạn có thể chuyển các tham số giữa các công việc với DSL như sau:

Giả sử tham số chuỗi có sẵn "CVS_TAG", để chuyển nó cho các công việc khác:

build("pipeline_begin", CVS_TAG: params['CVS_TAG'])
parallel (
   // will be scheduled in parallel.
   { build("pipeline_static_analysis", CVS_TAG: params['CVS_TAG']) },
   { build("pipeline_nonreg", CVS_TAG: params['CVS_TAG']) }
)
// will be triggered after previous jobs complete
build("pipeline_end", CVS_TAG: params['CVS_TAG'])

Gợi ý để hiển thị các biến / tham số có sẵn:

// output values
out.println '------------------------------------'
out.println 'Triggered Parameters Map:'
out.println params
out.println '------------------------------------'
out.println 'Build Object Properties:'
build.properties.each { out.println "$it.key -> $it.value" }
out.println '------------------------------------'

Build Flow Plugin không được dùng nữa, người dùng nên chuyển sang wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin
vhamon

7

Chỉ cần thêm câu trả lời của tôi ngoài câu trả lời của Nigel Kirby vì tôi chưa thể bình luận:

Để truyền một tham số được tạo động, bạn cũng có thể xuất biến trong ô 'Execute Shell' và sau đó chuyển nó qua 'Bản dựng tham số kích hoạt trên các dự án khác' => 'Tham số được xác định trước "=> đưa ra' YOUR_VAR = $ YOUR_VAR '. Nhóm của tôi sử dụng tính năng này để chuyển phiên bản gói npm từ công việc xây dựng sang công việc triển khai

CẬP NHẬT: ở trên chỉ hoạt động đối với các tham số được Jenkins tiêm vào, tham số được tạo từ trình bao vẫn cần sử dụng phương thức tương tự. ví dụ. echo YOUR_VAR = $ {YOUR_VAR}> variable.properties và chuyển tệp đó xuống dòng


3

Tôi cũng gặp phải vấn đề tương tự khi phải chuyển phiên bản pom cho công việc Rundeck hạ lưu.

Những gì tôi đã làm, là sử dụng việc tiêm tham số qua tệp thuộc tính như sau:

1) Tạo thuộc tính trong tệp thuộc tính thông qua shell:

Xây dựng các hành động:

  • Thực thi một tập lệnh shell
  • Tiêm các biến môi trường

Vd: định nghĩa thuộc tính

2) Chuyển các thuộc tính đã xác định cho công việc phía dưới: Post Build Actions:

  • Kích hoạt bản dựng được tham số hóa trên dự án khác
  • Thêm thông số: Thông số bản dựng hiện tại
  • Thêm tham số: tham số xác định trước

Vd: gửi thuộc tính

3) Sau đó, có thể sử dụng $ POM_VERSION như vậy trong công việc Rundeck hạ nguồn.

/! \ Jenkins Phiên bản: 1.636

/! \ Vì một số lý do khi tạo bản dựng được kích hoạt, cần phải thêm tùy chọn 'Tham số bản dựng hiện tại' để chuyển các thuộc tính.


CHỈNH SỬA: Tìm thấy một blooper trong những gì tôi đã viết. Trong định nghĩa thuộc tính, lẽ ra phải là: echo POM_VERSION = $ POM_VERSION> play.properties chứ không phải: echo $ POM_VERSION >> play.properties Xin lỗi về điều đó.
Eli Mous

2

Đọc qua các câu trả lời, tôi không thấy một tùy chọn nào khác mà tôi thích cũng sẽ cung cấp cho nó. Tôi thích tham số hóa công việc, nhưng nó không phải lúc nào cũng mở rộng quy mô tốt. Nếu bạn có các công việc không trực tiếp xuống phía dưới của công việc đầu tiên nhưng ở xa hơn trong đường ống dẫn, bạn không thực sự muốn tham số hóa mọi công việc trong đường ống để có thể chuyển các tham số đến hết mức. Hoặc nếu bạn có một số lượng lớn các tham số được sử dụng bởi nhiều công việc khác (đặc biệt là những công việc không nhất thiết phải gắn với một công việc chính hoặc công việc chính), thì tham số hóa lại không hoạt động.

Trong những trường hợp này, tôi ưu tiên xuất các giá trị vào tệp thuộc tính và sau đó đưa giá trị đó vào bất kỳ công việc nào tôi cần bằng cách sử dụng plugin EnvInject . Điều này có thể được thực hiện động, là một cách khác để giải quyết vấn đề từ một câu trả lời khác ở trên, nơi các công việc được tham số hóa vẫn được sử dụng. Giải pháp này có quy mô rất tốt trong nhiều tình huống.


1

Bạn có thể sử dụng trình tạo Hudson Groovy để thực hiện việc này.

Công việc đầu tiên đang triển khai

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

Công việc thứ hai trong quy trình

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


1
một câu trả lời dựa trên hai hình ảnh và liên kết ngoài không phải là một câu trả lời rất hữu ích
Will Barnwell

0

Tôi đã hiểu rồi!

Với gần 2 giờ thử và sai, tôi đã tìm ra.

Điều này HOẠT ĐỘNG và là những gì bạn làm để chuyển các biến cho công việc từ xa:

    def handle = triggerRemoteJob(remoteJenkinsName: 'remoteJenkins', job: 'RemoteJob' paramters: "param1=${env.PARAM1}\nparam2=${env.param2}")

Sử dụng \ n để phân tách hai tham số, không có dấu cách ..

Trái ngược với tham số: '' 'someparams' ''

chúng tôi sử dụng các tham số: "someparams"

"..." là giá trị của các biến mong muốn. (Đây là dấu ngoặc kép, không phải hai dấu ngoặc kép)

'' '...' '' hoặc '...' sẽ không cho chúng ta những giá trị đó. (Ba dấu nháy đơn hoặc chỉ nháy đơn)

Tất cả các tham số ở đây được xác định trong khối môi trường {} khi bắt đầu đường dẫn và được sửa đổi trong các giai đoạn> các bước> tập lệnh nếu cần thiết.

Tôi cũng đã thử nghiệm và thấy rằng khi bạn sử dụng "...", bạn không thể sử dụng một cái gì đó như '' '... "..."' '' hoặc "... '..'..." hoặc bất kỳ sự kết hợp nào của nó ...

Vấn đề ở đây là khi bạn đang sử dụng "..." trong phần tham số, bạn không thể chuyển một tham số chuỗi; ví dụ Điều này sẽ KHÔNG hoạt động:

    def handle = triggerRemoteJob(remoteJenkinsName: 'remoteJenkins', job: 'RemoteJob' paramters: "param1=${env.PARAM1}\nparam2='param2'")

nếu bạn muốn chuyển một cái gì đó giống như ở trên, bạn sẽ cần đặt một biến môi trường param2 = 'param2' và sau đó sử dụng $ {env.param2} trong phần tham số của bước plugin kích hoạt từ xa

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.