วิธีที่สะอาดที่สุดในการออกจากงาน Jenkins Pipeline ก่อนกำหนดเป็นความสำเร็จหรือไม่?


55

ฉันมีงานที่จะสร้างไฟล์ยกเว้นหนึ่งในค่าที่ถูกป้อนเข้ากับค่าที่เก่ากว่า อะไรคือวิธีที่สะอาดที่สุดในเจนกินส์ในการยกเลิกหรือออกจากงานโดยที่ไม่เป็นFAILED? SUCCESSมันออกเป็นพฤติกรรมที่ถูกต้องดังนั้นฉันต้องการสร้างที่มีเครื่องหมาย

มันจะจบลงด้วยคำสั่ง if หากเป็นเช่นนั้น

stage ('Check value') {

     if( $VALUE1 == $VALUE2 ) {
       //if they do match exit as a success, else continue with the rest of the job 
    }

}

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


1
เพียงแค่exit 0...
Tensibai

ฉันคิดว่าการทำเครื่องหมายว่างานล้มเหลว หากฉันผิดและคุณสามารถแสดงเอกสารฉันยินดีที่จะยอมรับว่าเป็นคำตอบ
อเล็กซ์

ดีสคริปต์เพียงทุบตีทางออก 0 หมายถึงความสำเร็จทางออกที่ไม่ใช่ศูนย์หมายถึงความล้มเหลว ...
Tensibai

นี่ไม่ได้อยู่ในสคริปต์ทุบตี แต่เป็นงานไปป์ไลน์ดังนั้น Groovy สิ่งนั้นเปลี่ยนไปหรือไม่?
Alex

ในโหมด groovy ฉันจะลอง a return 0ทั้งหมดในส่วนท้ายของโค้ด groovy ใด ๆ ที่ไม่ได้มีข้อยกเว้นฉันควรคิดอย่างไร ฉันจะให้คนที่มีพื้นหลังเพิ่มเติมเกี่ยวกับเจนกินส์ 2 ยืนยันหรืออ่อนแอ
Tensibai

คำตอบ:


45

คิดออก นอกขั้นตอนใด ๆ (ไม่เช่นนั้นจะสิ้นสุดขั้นตอนเฉพาะว่าเป็นความสำเร็จ) ทำสิ่งต่อไปนี้

if( $VALUE1 == $VALUE2 ) {
   currentBuild.result = 'SUCCESS'
   return
}

return จะหยุดสเตจหรือโหนดที่คุณกำลังทำงานซึ่งเป็นสาเหตุที่ทำให้มันทำงานนอกสเตจมีความสำคัญในขณะที่การตั้งค่าcurrentBuild.resultป้องกันไม่ให้มันล้มเหลว


การเพิ่งกลับมาควรปล่อยให้บิลด์มีสถานะเป็นสีเทาและไม่มีผลลัพธ์ ... จึงไม่เหมือนกับบิลด์ที่ล้มเหลว
drewish

1
คุณจะกลับมาและข้ามขั้นตอนที่เหลือทั้งหมดได้อย่างไร
Jess Bowers

1
@JessBowers ทุกอย่างเกี่ยวกับตำแหน่งที่คุณวางข้อมูลโค้ด ถ้าคุณทำระดับโหนดแทนระดับสเตจมันจะเสร็จสิ้นทั้งงาน
อเล็กซ์

4
โปรดทราบว่ามันใช้งานได้เฉพาะไปป์ไลน์ที่มีสคริปต์เท่านั้นไม่ใช่เพื่อการประกาศ
kagarlickij

@kagarlickij - ถูกต้องท่อส่งข้อมูลที่เปิดเผยไม่มีอยู่เมื่อเขียนคำตอบนี้!
Alex

10

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

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      error('Aborting the build.')
    }
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'SUCCESS'
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

แต่สิ่งนี้จะนำไปสู่สเตจสีแดงหากข้อผิดพลาดเกิดขึ้นภายในสเตจ

ป้อนคำอธิบายรูปภาพที่นี่

ขึ้นอยู่กับความต้องการของคุณในแบบที่คุณต้องการใช้


หากคุณกำลังจะทำเช่นนี้ทำ subclass ใหม่ของRuntimeExceptionการโยนแทนที่จะต้องจับข้อยกเว้นทั้งหมดและตรวจสอบธง
Michael Mrozek

1

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

ฉันยังไม่ได้คิดเรื่องนี้เลยยังไม่ได้ใช้ปลั๊กอิน

นอกจากนี้ยังมีเงื่อนไขที่พบในโพสต์ Stack Overflow ก่อนหน้านี้ใน Jenkins: Jenkins Pipeline Conditional Step / Stage


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

คุณจะแนะนำอะไร กำลังย้ายไปยังคำสั่งสิ้นสุดหรือไม่ การเพิ่มตัวคัดเลือก "โดยทั่วไป"? คุณให้ "คำติชม" แต่มันไม่ง่ายเลยที่ฉันจะบอกความตั้งใจหรือลงมือทำ
MrMesees

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

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

3
ฉันพยายามทำให้ชัดเจนยิ่งขึ้นไม่จำเป็นต้องขอโทษเลยภาษาเป็นสัตว์ที่ไม่แน่นอนโดยเฉพาะอย่างยิ่งบนอินเทอร์เน็ต :)
MrMesees

0

Executor.interrupt(Result)เป็นวิธีที่สะอาดทางตรงที่สุดที่ฉันสามารถหาที่จะหยุดการสร้างก่อนเวลาอันควรและทำเครื่องหมายว่าเป็นความสำเร็จ

script {
    currentBuild.getRawBuild().getExecutor().interrupt(Result.SUCCESS)
}

ข้อดี :

  • ทำงานในขั้นตอนการประกาศเช่นเดียวกับสคริปต์หนึ่ง
  • ไม่มีลอง / จับหรือข้อยกเว้นในการจัดการ
  • ทำเครื่องหมายระยะการโทรและสเตจที่ต่อเนื่องเป็นสีเขียว / ผ่านใน UI

ข้อเสีย :

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