วิธีเพิ่มขั้นตอนการหมดเวลาให้กับ Jenkins Pipeline


94

เมื่อคุณใช้โปรเจ็กต์ฟรีสไตล์คุณสามารถตั้งค่าได้ว่าหลังจาก 20 นาทีบิลด์จะถูกยกเลิกหากไม่ได้ข้อสรุป สิ่งนี้เป็นไปได้อย่างไรกับโครงการไปป์ไลน์หลายสาขาของเจนกินส์

คำตอบ:


194

คุณสามารถใช้ขั้นตอนการหมดเวลา :

timeout(20) {
  node {
    sh 'foo'
  }
}

หากคุณต้องการเวลาที่แตกต่างTimeUnitจากMINUTESคุณสามารถระบุunitอาร์กิวเมนต์:

timeout(time: 20, unit: 'SECONDS') {

แก้ไข ส.ค. 2018:ปัจจุบันมีท่อส่งประกาศที่ใช้กันทั่วไปมากขึ้น( pipelineโครงสร้างระดับบนสุดจำได้ง่าย) ยังสามารถระบุระยะหมดเวลาโดยใช้optionsในระดับต่างๆได้ (ต่อไปป์ไลน์โดยรวมหรือต่อขั้นตอน):

pipeline {
  options {
      timeout(time: 1, unit: 'HOURS') 
  }
  stages { .. }
  // ..
}

อย่างไรก็ตามหากคุณต้องการใช้การหมดเวลากับขั้นตอนเดียวในไปป์ไลน์ที่เปิดเผยสามารถใช้ได้ตามที่อธิบายไว้ข้างต้น


6
อ้างอิงยังอยู่ภายใต้ 1. เจนกินส์แดชบอร์ด<ใด ๆ โครงการท่อส่ง> ▼→ ท่อส่งไวยากรณ์ขั้นตอนการอ้างอิงหรือ 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/→ อ้างอิงขั้นตอน
Gerold Broser

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

หากคุณต้องการทราบว่าโหนดนั้นออนไลน์อยู่หรือไม่คุณสามารถถามได้: def n=Jenkins.instance.getNode("ETService3") if (n!=null && n.computer && n.computer.online) { echo "Online" } else { echo "Offline" // wait a little bit and try again }วิธีที่ยุ่งยากคือการได้รับโหนดสองครั้ง ครั้งแรกที่มีการหมดเวลาภายนอกครั้งที่สองที่มีการหมดเวลาภายใน ฉันพลาดฟีเจอร์นี้ด้วย
elou

@ เจคนั่นน่าจะเป็นคำถาม!
charlie_pl

1
คุณจะส่งข้อความแสดงข้อผิดพลาดของคุณเองเมื่อหมดเวลาได้อย่างไร?
red888

6

สำหรับการ declarative ท่อส่งมันจะรับคำแนะนำให้ใช้ขั้นตอนหมดเวลาในตัวเลือกส่วน

รันโค้ดภายในบล็อกโดยมีการกำหนดระยะเวลาออก หากถึงเวลาที่กำหนดจะมีการโยนข้อยกเว้น (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException) ซึ่งนำไปสู่การยกเลิกการสร้าง (เว้นแต่จะถูกจับและประมวลผลอย่างใดอย่างหนึ่ง) หน่วยเป็นทางเลือก แต่มีค่าเริ่มต้นเป็นนาที

ขั้นตอนการหมดเวลามี 3 พารามิเตอร์ที่คุณสามารถกำหนดค่าได้:

  • เวลา (จำเป็น int)

    • จำนวนระยะหมดเวลาหากไม่มีหน่วยระบุระยะเวลาเป็นนาที
  • กิจกรรม (ทางเลือกบูลีน)

    • หมดเวลาหลังจากไม่มีกิจกรรมในบันทึกสำหรับบล็อกนี้แทนที่จะเป็นระยะเวลาสัมบูรณ์
  • หน่วย (ไม่บังคับ, ค่า: NANOSECONDS, MICROSECONDS, มิลลิวินาที, วินาที, นาที, ชั่วโมง, วัน)

    • หน่วยของเวลาค่าเริ่มต้นคือMINUTES

ตัวอย่าง:

timeout(time: 10) // would lead to a timeout of 10 minutes (MINUTES is default value)
timeout(time: 10, unit: 'SECONDS') // a 10 seconds timeout
timeout(time: 10, activity: false, unit: 'MILLISECONDS')

เอกสารเจนกินส์อย่างเป็นทางการมีตัวอย่างที่ดีมากสำหรับการใช้งานของหมดเวลาไปนี้:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

2
activityมีเท็จเป็นค่าเริ่มต้น เมื่อactivityใดที่เป็นเท็จ - หมดเวลาสำหรับงานทั้งหมดสำหรับการtrueหมดเวลาสำหรับกิจกรรม (เพื่อพิมพ์อะไรลงในบันทึก)
Maxim Suslov

1
ฉันต้องการเพิ่มสtimeoutเตจเฉพาะเพื่อให้สเตจถัดไปทำงานอย่างสง่างาม ในตัวอย่างข้างต้นไปป์ไลน์จะถูกยกเลิกหลังจากหมดเวลาและไม่ดำเนินการขั้นตอนต่อ ๆ ไป มีวิธีที่จะบรรลุความต้องการของฉันหรือไม่? รหัสตัวอย่างสำหรับการหมดเวลาของเวทีที่กำหนด (จาก Jenkins Doc อย่างเป็นทางการ):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.