Jenkins - ผ่านตัวแปรระหว่างงาน?


88

ฉันมีงานสองงานในเจนกินส์ซึ่งทั้งสองงานต้องการพารามิเตอร์เดียวกัน

ฉันจะรันงานแรกด้วยพารามิเตอร์ได้อย่างไรเพื่อที่เมื่อเรียกใช้งานที่สองจะใช้พารามิเตอร์เดียวกัน


เราสามารถใช้ได้หลายวิธีวิธีที่ดีที่สุดวิธีหนึ่งคือใช้พารามิเตอร์งานปัจจุบันหรือใช้พารามิเตอร์ที่กำหนดไว้ล่วงหน้าในทริกเกอร์งานดาวน์สตรีม
ksr

1
ชื่อนี้สับสนมาก "การส่งผ่านตัวแปรระหว่างงาน" เป็นอย่างไร? คำตอบที่ยอมรับก็คือปลั๊กอิน แฟนซีว่า!
Rakib

คำตอบ:


73

คุณสามารถใช้Parameterized Trigger Pluginซึ่งจะช่วยให้คุณส่งผ่านพารามิเตอร์จากงานหนึ่งไปยังอีกงานหนึ่งได้

คุณต้องเพิ่มพารามิเตอร์นี้ที่คุณส่งผ่านจากต้นน้ำในปลายน้ำ


10
สวัสดีขอโทษที่ฟังดูเหมือน noob แต่จะเป็นไรไหมถ้ามีคนสามารถแก้ไขสิ่งนี้พร้อมรายละเอียดเกี่ยวกับวิธีการใช้งาน Parameterized Trigger Plugin
Fadi

10
หมายเหตุด้านข้าง: ดูเหมือนว่าตัวแปรสภาพแวดล้อมที่ส่งออกที่สร้างในส่วน bash script จะไม่มีสิทธิ์ทดแทนในพารามิเตอร์เอาต์พุต (ตัวอย่างเช่น 'export VERSION' จะไม่ทำให้ 'UPSTREAM_VERSION = $ VERSION' รับค่าที่ถูกต้อง แต่ได้รับ '$ VERSION' แทน)
Mark McKenna

21
คำตอบนี้ไม่เพียงพอ
tarabyte

6
ฉันยอมรับว่าควรมีตัวอย่างวิธีการส่งผ่านพารามิเตอร์ไปยังงานเป้าหมาย หน้า Parameterized Trigger Plugin ในปัจจุบันไม่ได้ให้ข้อมูลที่ดีเกี่ยวกับเรื่องนี้ อาจมีเช่นไวยากรณ์ประเภทใดที่คุณควรใช้ในการส่งผ่านพารามิเตอร์
skrii

2
ดูเหมือนว่าปลั๊กอินจะไม่ทำงานอีกต่อไป ดูรายการปัญหาที่เปิดอยู่ ฉันไม่สามารถส่งผ่านค่าพารามิเตอร์ด้วยปลั๊กอินนี้ได้อีกต่อไป วิธีแก้ปัญหาอื่น ๆ ?
Markus L

38

1. การดำเนินการหลังการสร้าง> เลือก” ทริกเกอร์สร้างพารามิเตอร์ที่สร้างขึ้นในโครงการอื่น ๆ ”

2. ป้อนตัวแปรสภาพแวดล้อมด้วยค่า Value สามารถเป็น Jenkins Build Parameters ได้

สามารถดูขั้นตอนโดยละเอียดได้ที่นี่: -

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

หวังว่าจะเป็นประโยชน์ :)


คำตอบนี้ตรงตามคำถามที่ OP โพสโดยไม่ต้องใช้ปลั๊กอินหรือใช้ DSL
BTC

8
FYI คำตอบนี้ยังคงต้องใช้ปลั๊กอิน
Thomas Lee

ปลั๊กอินนั้นยอดเยี่ยมเมื่อ แต่ไม่สามารถส่งผ่านค่าตัวแปรที่ตั้งไว้ในส่วนคำสั่ง execute shell
Tara Prasad Gurung

25

คำตอบที่ได้รับการยอมรับที่นี่ไม่ทำงานสำหรับกรณีการใช้งานของฉัน ฉันจำเป็นต้องสามารถสร้างพารามิเตอร์แบบไดนามิกในงานหนึ่งและส่งต่อไปยังอีกงานหนึ่ง ดังที่Mark McKennaกล่าวถึงดูเหมือนจะไม่มีวิธีใดที่จะส่งออกตัวแปรจากขั้นตอนการสร้างเชลล์ไปยังการดำเนินการสร้างโพสต์

ฉันประสบความสำเร็จในการแก้ปัญหาโดยใช้Parameterized Trigger Pluginโดยการเขียนค่าลงในไฟล์และใช้ไฟล์นั้นเป็นพารามิเตอร์เพื่อนำเข้าผ่าน 'Add post-build action' -> 'Trigger parameterized build ... ' จากนั้นเลือก 'Add Parameters' - > 'พารามิเตอร์จากไฟล์คุณสมบัติ'


นี่คือสิ่งที่ฉันต้องการ ขอบคุณ.
luckytaxi

หากคุณยินดีที่จะใช้ไปป์ไลน์ jenkins 2.x คุณสามารถใช้ writeFile / stash-> unstash / readFile เพื่อคัดลอกข้อมูลสถานะระหว่างงาน slideshare.net/ericlongtx/…เช็คเอาต์สไลด์ 21 สำหรับตัวอย่าง
นอนพักกลางวัน

สิ่งนี้จำเป็นหากคุณต้องการให้ตัวแปร SHELL ส่งผ่าน ชื่นชมมากสำหรับคำตอบนี้
Carl Wainwright

18

ฉันคิดว่าคำตอบข้างต้นต้องการการอัปเดต:

ฉันพยายามสร้างไดเร็กทอรีไดนามิกเพื่อเก็บสิ่งประดิษฐ์บิวด์อัพสตรีมดังนั้นฉันจึงต้องการส่งต่อหมายเลขบิวด์งานอัพสตรีมไปยังงานดาวน์สตรีมฉันลองทำตามขั้นตอนข้างต้นแล้ว แต่ไม่สามารถใช้งานได้ นี่คือวิธีการทำงาน:

  1. ฉันคัดลอกอาร์ติแฟกต์จากงานปัจจุบันของฉันโดยใช้ปลั๊กอินคัดลอกอาร์ติแฟกต์
  2. ในโพสต์การดำเนินการสร้างของงานต้นน้ำฉันได้เพิ่มตัวแปรเช่น "SOURCE_BUILD_NUMBER = $ {BUILD_NUMBER}" และกำหนดค่าให้ทริกเกอร์งานดาวน์สตรีม
  3. ทุกอย่างทำงานได้ยกเว้นว่างานขั้นปลายของฉันไม่สามารถรับ $ SOURCE_BUILD_NUMBER เพื่อสร้างไดเร็กทอรี
  4. ดังนั้นฉันจึงพบว่าในการใช้ตัวแปรนี้ฉันต้องกำหนดตัวแปรเดียวกันในงานดาวน์สตรีมเป็นตัวแปรพารามิเตอร์เช่นในภาพด้านล่างนี้:

ใส่คำอธิบายภาพที่นี่

เนื่องจากเจนกินส์เวอร์ชันใหม่ต้องการให้คุณกำหนดตัวแปรในงานดาวน์สตรีมด้วย ฉันหวังว่ามันจะเป็นประโยชน์


เห็นด้วยอย่างสิ้นเชิง. นี่คือการอัปเดตที่จำเป็นซึ่งตอบคำถามเบื้องต้นเสร็จสมบูรณ์ 100%
CodeSlave

ฉันลองใช้ตัวเลือกเพิ่มคะแนนอีกสองตัวเลือก แต่ทั้งสองตัวเลือกไม่ได้ผลจนกว่าจะเพิ่มการกำหนดค่าพิเศษที่ระบุไว้ในขั้นตอนที่ 4 ด้านบน ฉันไม่จำเป็นต้องเปิดใช้งานคัดลอกอาร์ติแฟกต์เพื่อให้มันทำงานได้
Jeff Fol

10

(สำหรับเพื่อน Googler)

หากคุณกำลังสร้างไปป์ไลน์ที่จริงจังด้วยBuild Flow Pluginคุณสามารถส่งผ่านพารามิเตอร์ระหว่างงานด้วย DSL ดังนี้:

สมมติว่ามีสตริงพารามิเตอร์ "CVS_TAG" เพื่อส่งต่อไปยังงานอื่น ๆ :

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

คำแนะนำสำหรับการแสดงตัวแปร / พารามิเตอร์ที่มี:

// 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 เลิกใช้แล้วผู้ใช้ควรย้ายไปที่wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin
vhamon

7

เพียงเพิ่มคำตอบของฉันเพิ่มเติมจาก Nigel Kirby เพราะฉันยังไม่สามารถแสดงความคิดเห็นได้:

ในการส่งผ่านพารามิเตอร์ที่สร้างขึ้นแบบไดนามิกคุณยังสามารถส่งออกตัวแปรในไทล์ 'Execute Shell' แล้วส่งผ่าน 'Trigger parameterized build on other projects' => 'Predefined parameters "=> give' YOUR_VAR = $ YOUR_VAR ' ทีมของฉันใช้คุณลักษณะนี้เพื่อส่งผ่านเวอร์ชันแพ็กเกจ npm จากงานสร้างไปจนถึงงานการปรับใช้

อัปเดต: ด้านบนใช้ได้กับพารามิเตอร์ที่ฉีดเจนกินส์เท่านั้นพารามิเตอร์ที่สร้างจากเชลล์ยังคงต้องใช้วิธีการเดียวกัน เช่น. echo YOUR_VAR = $ {YOUR_VAR}> variable.properties และส่งไฟล์นั้นไปที่ดาวน์สตรีม


3

ฉันประสบปัญหาเดียวกันเมื่อฉันต้องส่งรุ่นปอมไปที่งาน Rundeck ขั้นปลาย

สิ่งที่ฉันทำคือใช้การแทรกพารามิเตอร์ผ่านไฟล์คุณสมบัติดังนี้:

1) การสร้างคุณสมบัติในไฟล์คุณสมบัติผ่านเชลล์:

สร้างการกระทำ:

  • ดำเนินการเชลล์สคริปต์
  • ใส่ตัวแปรสภาพแวดล้อม

เช่นนิยามคุณสมบัติ

2) การส่งผ่านคุณสมบัติที่กำหนดไปยังงานดาวน์สตรีม: โพสต์การดำเนินการสร้าง:

  • ทริกเกอร์สร้างพารามิเตอร์บนโปรเจ็กต์อื่น
  • เพิ่มพารามิเตอร์: พารามิเตอร์การสร้างปัจจุบัน
  • เพิ่มพารามิเตอร์: พารามิเตอร์ที่กำหนดไว้ล่วงหน้า

เช่นคุณสมบัติการส่ง

3) เป็นไปได้ที่จะใช้ $ POM_VERSION ในงาน Downstream Rundeck

/! \ Jenkins เวอร์ชัน: 1.636.0

/! \ ด้วยเหตุผลบางประการในการสร้างบิลด์ที่ถูกทริกเกอร์จำเป็นต้องเพิ่มตัวเลือก 'พารามิเตอร์การสร้างปัจจุบัน' เพื่อส่งผ่านคุณสมบัติ


แก้ไข: พบการปล่อยไก่ในสิ่งที่ฉันเขียน ในคำจำกัดความคุณสมบัติควรเป็น: echo POM_VERSION = $ POM_VERSION> play.properties และไม่ใช่: echo $ POM_VERSION >> play.properties ขออภัยด้วย
Eli Mous

2

เมื่ออ่านคำตอบฉันไม่เห็นตัวเลือกอื่นที่ฉันชอบก็จะเสนอให้เช่นกัน ฉันชอบการกำหนดพารามิเตอร์ของงาน แต่ก็ไม่ได้ปรับขนาดได้ดีเสมอไป หากคุณมีงานที่ไม่ได้อยู่ปลายน้ำของงานแรกโดยตรง แต่อยู่ไกลออกไปจากท่อคุณไม่ต้องการกำหนดพารามิเตอร์ทุกงานในไปป์ไลน์เพื่อให้สามารถส่งผ่านพารามิเตอร์ไปได้ตลอดทาง หรือถ้าคุณมีพารามิเตอร์จำนวนมากที่ใช้โดยงานอื่น ๆ (โดยเฉพาะพารามิเตอร์ที่ไม่จำเป็นต้องเชื่อมโยงกับงานหลักหรืองานหลัก) การกำหนดพารามิเตอร์อีกครั้งจะไม่ทำงาน

ในกรณีเหล่านี้ฉันชอบที่จะส่งออกค่าไปยังไฟล์คุณสมบัติแล้วฉีดสิ่งนั้นในงานใด ๆ ที่ฉันต้องการโดยใช้ปลั๊กอินEnvInject สิ่งนี้สามารถทำได้แบบไดนามิกซึ่งเป็นอีกวิธีหนึ่งในการแก้ปัญหาจากคำตอบอื่นข้างต้นซึ่งยังคงใช้งานแบบกำหนดพารามิเตอร์ โซลูชันนี้ปรับขนาดได้ดีในหลายสถานการณ์


1

คุณสามารถใช้ตัวสร้าง Hudson Groovyเพื่อทำสิ่งนี้

งานแรกในท่อ

ใส่คำอธิบายภาพที่นี่

งานที่สองในท่อ

ใส่คำอธิบายภาพที่นี่


1
คำตอบจากรูปภาพสองรูปและลิงก์ภายนอกไม่ใช่คำตอบที่เป็นประโยชน์มากนัก
Will Barnwell

0

ฉันคิดออกแล้ว!

ด้วยการลองผิดลองถูกเกือบ 2 ชั่วโมงฉันก็คิดออก

สิ่งนี้ใช้ได้ผลและเป็นสิ่งที่คุณทำเพื่อส่งผ่านตัวแปรไปยังงานระยะไกล:

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

ใช้ \ n เพื่อแยกพารามิเตอร์สองตัวโดยไม่มีช่องว่าง ..

ตรงข้ามกับพารามิเตอร์: '' 'someparams' ''

เราใช้พารามิเตอร์: "someparams"

"... " คือสิ่งที่ทำให้เราได้รับค่าของตัวแปรที่ต้องการ (นี่คือเครื่องหมายคำพูดคู่ไม่ใช่สองคำพูดเดี่ยว)

'' '... ' '' หรือ '... ' จะไม่ได้รับค่าเหล่านั้นมาให้เรา (สามคำพูดเดียวหรือเพียงคำพูดเดียว)

พารามิเตอร์ทั้งหมดที่นี่ถูกกำหนดในสภาพแวดล้อม {} บล็อกที่จุดเริ่มต้นของไปป์ไลน์และได้รับการแก้ไขในขั้นตอน> ขั้นตอน> สคริปต์เมื่อจำเป็น

ฉันยังทดสอบและพบว่าเมื่อคุณใช้ "... " คุณไม่สามารถใช้บางอย่างเช่น '' '... "... "' '' หรือ "... '..'... " หรือการรวมกันของ มัน...

สิ่งที่จับได้คือเมื่อคุณใช้ "... " ในส่วนพารามิเตอร์คุณไม่สามารถส่งผ่านพารามิเตอร์สตริงได้ ตัวอย่างเช่นสิ่งนี้จะไม่ทำงาน:

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

หากคุณต้องการส่งผ่านสิ่งที่ต้องการข้างต้นคุณจะต้องตั้งค่าตัวแปรสภาพแวดล้อม param2 = 'param2' จากนั้นใช้ $ {env.param2} ในส่วนพารามิเตอร์ของขั้นตอนปลั๊กอินทริกเกอร์ระยะไกล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.