Jenkins - melewati variabel di antara pekerjaan?

88

Saya memiliki dua pekerjaan di jenkins, keduanya membutuhkan parameter yang sama.

Bagaimana cara menjalankan pekerjaan pertama dengan parameter sehingga ketika memicu pekerjaan kedua, parameter yang sama digunakan?

Stefan Kendall
sumber
Kita dapat menggunakan banyak cara: Salah satu cara terbaik adalah menggunakan parameter pekerjaan saat ini, Atau menggunakan parameter yang telah ditentukan dalam pekerjaan hilir pemicu
ksr
1
Judul ini sangat membingungkan. Bagaimana ini "variabel yang lewat di antara pekerjaan?". Jawaban yang juga diterima adalah plugin. Bayangkan itu!
Rakib

Jawaban:

73

Anda dapat menggunakan Plugin Parameterized Trigger yang memungkinkan Anda meneruskan parameter dari satu tugas ke tugas lainnya.

Anda juga perlu menambahkan parameter yang Anda teruskan dari upstream ke downstream.

Łukasz Rżanek
sumber
10
Hai, maaf karena terdengar seperti noob, tetapi apakah tidak apa-apa jika seseorang dapat mengedit ini dengan detail tentang cara melakukannya dengan Plugin Parameterized Trigger?
Fadi
10
Catatan tambahan: Sepertinya variabel lingkungan yang diekspor yang dibuat di bagian skrip bash memenuhi syarat untuk substitusi dalam parameter output (misalnya 'export VERSION' tidak akan membuat 'UPSTREAM_VERSION = $ VERSION' mengambil nilai yang benar; itu hanya mendapat '$ VERSION' sebagai gantinya).
Mark McKenna
21
Jawaban ini tidak cukup
tarabyte
6
Saya setuju bahwa harus ada semacam contoh bagaimana meneruskan parameter ke pekerjaan target. Halaman Plugin Parameterized Trigger saat ini tidak memberikan informasi yang baik tentang ini. Mungkin ada, misalnya jenis sintaks apa yang harus Anda gunakan untuk meneruskan parameter.
skrii
2
Plugin sepertinya tidak berfungsi lagi. Lihat daftar panjang masalah terbuka . Saya tidak bisa meneruskan nilai parameter apa pun dengan plugin ini lagi. Ada solusi lain?
Markus L
38

1. Tindakan Pasca-Bangun> Pilih "Picu build berparameter pada proyek lain"

2. Masukkan variabel lingkungan dengan value.Nilai juga bisa berupa Parameter Build Jenkins.

Langkah-langkah rinci dapat dilihat di sini: -

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

Semoga bermanfaat :)

Vinu Joseph
sumber
Jawaban ini memenuhi pertanyaan OP tanpa memerlukan plugin atau menggunakan DSL.
BTC
8
FYI, jawaban ini masih butuh plugin.
Thomas Lee
Plugin ini sangat bagus ketika tetapi tidak dapat melewatkan nilai variabel yang ditetapkan di bagian perintah eksekusi shell.
Tara Prasad Gurung
25

The jawaban yang diterima di sini tidak bekerja untuk kasus penggunaan saya. Saya harus mampu membuat parameter secara dinamis dalam satu pekerjaan dan meneruskannya ke pekerjaan lain. Seperti yang disebutkan Mark McKenna, sepertinya tidak ada cara untuk mengekspor variabel dari langkah build shell ke tindakan post build.

Saya mencapai solusi menggunakan Plugin Parameterized Trigger dengan menulis nilai ke file dan menggunakan file itu sebagai parameter untuk diimpor melalui 'Add post-build action' -> 'Trigger parameterized build ...' lalu pilih 'Add Parameters' - > 'Parameter dari file properti'.

Nigel Kirby
sumber
Inilah yang saya butuhkan. Terima kasih.
luckytaxi
Jika Anda ingin menggunakan pipeline jenkins 2.x, Anda dapat menggunakan writeFile / stash-> unstash / readFile untuk menyalin data status di antara tugas. slideshare.net/ericlongtx/… Lihat slide 21 sebagai contoh.
tidur siang
Ini diperlukan jika Anda ingin variabel SHELL dilewati. Sangat dihargai untuk jawaban ini.
Carl Wainwright
18

Saya pikir jawaban di atas perlu beberapa pembaruan:

Saya mencoba membuat direktori dinamis untuk menyimpan artefak build upstream saya, jadi saya ingin meneruskan nomor build pekerjaan upstream saya ke pekerjaan downstream. Saya mencoba langkah-langkah di atas tetapi tidak dapat membuatnya berfungsi. Begini cara kerjanya:

  1. Saya menyalin artefak dari pekerjaan saya saat ini menggunakan plugin copy artifacts.
  2. Dalam tindakan post build dari pekerjaan upstream, saya menambahkan variabel seperti "SOURCE_BUILD_NUMBER = $ {BUILD_NUMBER}" dan mengonfigurasinya untuk memicu pekerjaan downstream.
  3. Semuanya berfungsi kecuali pekerjaan hilir saya tidak bisa mendapatkan $ SOURCE_BUILD_NUMBER untuk membuat direktori.
  4. Jadi saya menemukan bahwa untuk menggunakan variabel ini saya harus mendefinisikan variabel yang sama di pekerjaan hilir sebagai variabel parameter seperti pada gambar di bawah ini:

masukkan deskripsi gambar di sini

Ini karena versi baru jenkins mengharuskan Anda untuk menentukan variabel di tugas hilir juga. Saya harap ini membantu.

Tarun
sumber
Setuju. Ini adalah pembaruan wajib yang 100% melengkapi jawaban awal.
CodeSlave
Saya juga mencoba dua opsi upvoted tetapi tidak ada yang berhasil sampai menambahkan konfigurasi tambahan yang diuraikan pada langkah 4 di atas. Saya tidak perlu mengaktifkan artefak salinan agar dapat berfungsi.
Jeff Fol
10

(untuk sesama karyawan Google)

Jika Anda membangun pipeline yang serius dengan Build Flow Plugin , Anda dapat meneruskan parameter antara pekerjaan dengan DSL seperti ini:

Misalkan tersedia parameter string "CVS_TAG", untuk meneruskannya ke pekerjaan lain:

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'])

Petunjuk untuk menampilkan variabel / params yang tersedia:

// 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 '------------------------------------'
Offirmo
sumber
Build Flow Plugin tidak digunakan lagi, pengguna harus bermigrasi ke wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin
vhamon
7

Cukup tambahkan jawaban saya selain Nigel Kirby karena saya belum bisa berkomentar:

Untuk meneruskan parameter yang dibuat secara dinamis, Anda juga dapat mengekspor variabel dalam ubin 'Execute Shell' dan kemudian meneruskannya melalui 'Trigger parameterized build on other projects' => 'Predefined parameter "=> berikan' YOUR_VAR = $ YOUR_VAR '. Tim saya menggunakan fitur ini untuk meneruskan versi paket npm dari pekerjaan pembuatan ke pekerjaan penerapan

UPDATE: di atas hanya berfungsi untuk parameter yang diinjeksi Jenkins, parameter yang dibuat dari shell masih perlu menggunakan metode yang sama. misalnya. echo YOUR_VAR = $ {YOUR_VAR}> variable.properties dan meneruskan file itu ke hilir

Shawn
sumber
3

Saya menghadapi masalah yang sama ketika saya harus meneruskan versi pom ke pekerjaan Rundeck hilir.

Apa yang saya lakukan, menggunakan injeksi parameter melalui file properti seperti:

1) Membuat properti di file properti melalui shell:

Bangun tindakan:

  • Jalankan skrip shell
  • Masukkan variabel lingkungan

Misalnya: definisi properti

2) Meneruskan properti yang ditentukan ke pekerjaan downstream: Tindakan Pasca Build:

  • Memicu build berparameter pada project lain
  • Tambahkan parameter: Parameter build saat ini
  • Tambahkan parameter: parameter yang telah ditentukan sebelumnya

Misalnya: pengiriman properti

3) Kemudian mungkin untuk menggunakan $ POM_VERSION seperti itu dalam tugas Rundeck hilir.

/! \ Jenkins Versi: 1.636

/! \ Untuk beberapa alasan saat membuat build yang dipicu, perlu untuk menambahkan opsi 'Parameter build saat ini' untuk meneruskan properti.

Eli Mous
sumber
EDIT: Menemukan kesalahan besar dalam apa yang saya tulis. Dalam definisi properti, seharusnya: echo POM_VERSION = $ POM_VERSION> play.properties dan bukan: echo $ POM_VERSION >> play.properties Maaf tentang itu.
Eli Mous
2

Membaca jawabannya, saya tidak melihat opsi lain yang saya suka sehingga saya juga akan menawarkannya. Saya suka parameterisasi pekerjaan, tetapi tidak selalu berskala baik. Jika Anda memiliki pekerjaan yang tidak langsung di bagian hilir dari pekerjaan pertama tetapi lebih jauh di dalam pipeline, Anda tidak benar-benar ingin membuat parameterisasi setiap pekerjaan di pipeline agar dapat meneruskan parameter sepenuhnya. Atau jika Anda memiliki sejumlah besar parameter yang digunakan oleh berbagai pekerjaan lain (terutama yang tidak harus terkait dengan satu pekerjaan induk atau master), sekali lagi parameterisasi tidak berfungsi.

Dalam kasus ini, saya lebih suka mengeluarkan nilai ke file properti dan kemudian memasukkannya ke dalam pekerjaan apa pun yang saya butuhkan menggunakan plugin EnvInject . Ini dapat dilakukan secara dinamis, yang merupakan cara lain untuk menyelesaikan masalah dari jawaban lain di atas di mana pekerjaan berparameter masih digunakan. Solusi ini berskala sangat baik dalam banyak skenario.

tbradt
sumber
1

Anda dapat menggunakan pembuat Hudson Groovy untuk melakukan ini.

Pekerjaan Pertama di dalam pipa

masukkan deskripsi gambar di sini

Pekerjaan kedua di jalur pipa

masukkan deskripsi gambar di sini

CAMOBAP
sumber
1
jawaban berdasarkan dua gambar dan tautan eksternal bukanlah jawaban yang sangat membantu
Will Barnwell
0

Saya menemukan jawabannya!

Dengan trial and error hampir 2 jam, saya menemukan jawabannya.

Ini BEKERJA dan apa yang Anda lakukan untuk meneruskan variabel ke pekerjaan jarak jauh:

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

Gunakan \ n untuk memisahkan dua parameter, tanpa spasi ..

Berbeda dengan parameter: '' 'someparams' ''

kami menggunakan parameter: "someparams"

"..." inilah yang memberi kita nilai variabel yang diinginkan. (Ini adalah tanda kutip ganda, bukan dua tanda kutip tunggal)

'' '...' '' atau '...' tidak akan memberi kita nilai-nilai itu. (Tiga tanda kutip tunggal atau hanya satu tanda kutip)

Semua parameter di sini didefinisikan dalam blok {} lingkungan pada awal pipeline dan dimodifikasi dalam tahapan> langkah> skrip jika diperlukan.

Saya juga menguji dan menemukan bahwa ketika Anda menggunakan "..." Anda tidak dapat menggunakan sesuatu seperti '' '... "..."' '' atau "... '..'..." atau kombinasi dari Itu...

Tangkapannya di sini adalah bahwa ketika Anda menggunakan "..." di bagian parameter, Anda tidak dapat mengirimkan parameter string; misalnya Ini TIDAK AKAN BEKERJA:

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

jika Anda ingin meneruskan sesuatu seperti di atas, Anda perlu menyetel variabel lingkungan param2 = 'param2' dan kemudian menggunakan $ {env.param2} di bagian parameter langkah plugin pemicu jarak jauh

Mihir Deshpande
sumber