जेनकींस पाइपलाइन के लिए एक टाइमआउट कदम कैसे जोड़ें


93

जब आप एक नि: शुल्क शैली परियोजना का उपयोग कर रहे हैं, तो आप यह निर्धारित कर सकते हैं कि 20 मिनट के बाद निर्माण समाप्त नहीं हुआ है। जेनकींस मल्टी ब्रांच पाइपलाइन प्रोजेक्ट के साथ यह कैसे संभव है?

जवाबों:


189

आप टाइमआउट चरण का उपयोग कर सकते हैं :

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

यदि आपको MINUTESTimeUnit से भिन्न की आवश्यकता है , तो आप तर्क की आपूर्ति कर सकते हैं :unit

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

EDIT अगस्त 2018: आजकल अधिक सामान्य घोषणात्मक पाइपलाइनों (आसानी से शीर्ष स्तर के pipelineनिर्माण द्वारा मान्यता प्राप्त ) के साथ, optionsविभिन्न स्तरों (प्रति समग्र पाइपलाइन या प्रति चरण) का उपयोग करके टाइमआउट भी निर्दिष्ट किया जा सकता है :

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

फिर भी, यदि आप एक घोषणात्मक पाइपलाइन में एक ही चरण के लिए समय-सीमा लागू करना चाहते हैं, तो इसका उपयोग ऊपर वर्णित के रूप में किया जा सकता है।


6
संदर्भ 1 के तहत भी उपलब्ध है। जेनकिंस डैशबोर्ड<किसी भी पाइपलाइन परियोजना> eline → पाइपलाइन सिंटैक्सचरण संदर्भ या 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/चरण संदर्भ
गेरोल्ड ब्रोसर

2
क्या केवल नोड को प्राप्त करने का हिस्सा फरआउट करना संभव है, और सामग्री को चलाने में खर्च किए गए समय की गणना नहीं करना है? Ie: कभी-कभी नोड्स ऑफ़लाइन होते हैं और मुझे नौकरी के लिए एक रास्ता चाहिए अगर वह समय के बजाय एक नोड हासिल नहीं कर सकता है, लेकिन यह नहीं चाहता कि नौकरी विफल हो जाए अगर यह नोड हासिल कर ले और चल रहा है ..
जेक

यदि आप बस जानना चाहते हैं कि क्या नोड ऑनलाइन है तो आप इससे पूछ सकते हैं: 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 }नोड को दो बार हासिल करने के लिए एक मुश्किल तरीका है। बाहरी टाइमआउट के साथ पहली बार, आंतरिक टाइमआउट के साथ दूसरी। मुझे सुविधा भी याद आ रही है।
इलाउ

@ जेक, यह एक सवाल होना चाहिए!
charlie_pl

1
समय-सीमा समाप्त होने पर आप अपनी त्रुटि संदेश कैसे फेंकते हैं?
red888

5

एक घोषणा पाइपलाइन के लिए विकल्प-अनुभाग में टाइमआउट चरण का उपयोग करने की सलाह दी जाती है ।

निर्धारित समय सीमा के साथ ब्लॉक के अंदर कोड निष्पादित करता है। यदि समय सीमा पूरी हो जाती है, तो एक अपवाद (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException) फेंक दिया जाता है, जो बिल्ड को निरस्त करने की ओर जाता है (जब तक कि इसे पकड़ा नहीं जाता है और किसी तरह संसाधित किया जाता है)। यूनिट वैकल्पिक है लेकिन मिनटों के लिए चूक है।

टाइमआउट-चरण में 3 पैरामीटर हैं जिन्हें आप कॉन्फ़िगर कर सकते हैं:

  • समय (आवश्यक, इंट)

    • टाइमआउट की मात्रा, यदि कोई इकाई मिनटों में अवधि नहीं बताई गई है
  • गतिविधि (वैकल्पिक, बूलियन)

    • पूर्ण अवधि के बजाय इस ब्लॉक के लिए लॉग में कोई गतिविधि के बाद टाइमआउट।
  • इकाई (वैकल्पिक, मान: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS)

    • समय के लिए इकाई , डिफ़ॉल्ट 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टाइमआउट, गतिविधि के लिए टाइमआउट (लॉग में कुछ भी प्रिंट करने के लिए)।
मैक्सिम सुसलोव

1
मैं timeoutएक विशेष चरण के लिए इस तरह से जोड़ना चाहता हूं कि बाद के चरण को इनायत से चलना चाहिए। उपरोक्त उदाहरण में, पाइपलाइन को समय समाप्त होने के बाद छोड़ दिया जाता है और बाद के चरणों को निष्पादित नहीं किया जाता है। क्या मेरी आवश्यकता को पूरा करने का कोई तरीका है? किसी दिए गए चरण के टाइमआउट के लिए नमूना कोड (आधिकारिक जेनकिंस डॉक्टर से):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
यश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.