एक सफलता के रूप में जेनकींस पाइपलाइन नौकरी से समय से पहले निकलने का सबसे साफ तरीका?


55

मेरे पास एक नौकरी है जो फाइलें बनाएगी, जब तक कि उसे खिलाए जा रहे मूल्यों में से एक पुराने मूल्य से मेल नहीं खाती। जेनकींस में स्पष्ट तरीका गर्भपात या नौकरी से बाहर निकलें, के लिए क्या है बिना यह किया जा रहा है FAILED? यह बाहर निकलना सही व्यवहार है इसलिए मैं निर्माण को चिह्नित करना चाहता हूं SUCCESS

यह एक अगर इस तरह के बयान में खत्म हो जाएगा;

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...
तेंसिबाई

मैंने सोचा था कि नौकरी को विफल कर दिया? अगर मैं गलत हूं और आप प्रलेखन दिखा सकते हैं, तो मुझे यह स्वीकार करने में खुशी होगी कि एक जवाब के रूप में
एलेक्स

खैर, बस स्क्रिप्टों को
बकवास करें

यह बैश स्क्रिप्ट के भीतर नहीं है, यह पाइपलाइन का काम है, इसलिए ग्रूवी। क्या इससे चीजें बदल जाती हैं?
एलेक्स

Groovy में मैं सिर्फ एक कोशिश करूँगा return 0, सभी groovy कोड के सभी अंत में जो एक अपवाद नहीं फेंकता है मुझे क्या सोचना चाहिए। मैं किसी को
जेंकिंस

जवाबों:


46

पता लगा लिया। किसी भी चरण के बाहर (अन्यथा यह विशेष चरण को सफलता के रूप में समाप्त कर देगा) निम्नलिखित करें;

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

return आपके द्वारा चलाए जा रहे चरण या नोड को रोक देगा , इसीलिए इसे चरण के बाहर चलाना महत्वपूर्ण है, जबकि currentBuild.resultइसे विफल होने से रोकता है।


बस लौटते हुए बिल्ड को धूसर स्थिति के साथ छोड़ना चाहिए और कोई परिणाम नहीं होना चाहिए ... इसलिए असफल बिल्ड के समान नहीं।
आकर्षित किया

1
आप सभी शेष चरणों को कैसे लौटाते हैं और छोड़ते हैं?
जेस बोवर्स

1
@JessBowers यह सब है जहाँ आप स्निपेट डालते हैं। यदि आप इसे चरण-स्तर के बजाय नोड-स्तर करते हैं, तो यह संपूर्ण कार्य समाप्त कर देगा।
एलेक्स

4
कृपया ध्यान दें कि यह केवल स्क्रिप्टेड पाइपलाइन के लिए काम करता है, न कि घोषणापत्र के लिए
कागरलिकिज

@kagarlickij - इस उत्तर के लिखे जाने पर सही, घोषित पाइपलाइनें मौजूद नहीं थीं!
एलेक्स

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
}

लेकिन यह एक लाल चरण की ओर ले जाएगा, यदि त्रुटि एक चरण के भीतर होती है।

यहाँ छवि विवरण दर्ज करें

यह आपकी आवश्यकताओं पर निर्भर करता है कि आप किस तरीके का उपयोग करना चाहते हैं।


यदि आप इसे इस तरह से करने जा रहे हैं, तो RuntimeExceptionसभी अपवादों को पकड़ने और एक ध्वज की जांच करने की आवश्यकता के बजाय फेंकने के लिए एक नया उपवर्ग बनाएं
माइकल Mrozek

1

ईमानदारी से आपको विशेष रूप से निकास आदेश का उपयोग करने की आवश्यकता नहीं होनी चाहिए, लेकिन एक सशर्त बिल्डस्टेप प्लगिन है जो समान अंतिम परिणाम (कोड जो नहीं चलता है) प्राप्त कर सकता है।

मैं अभी तक इसके खिलाफ नहीं आया हूं, इसलिए मैंने प्लगइन का उपयोग नहीं किया है।

जेनकींस पर इस पूर्व स्टैक ओवरफ्लो पोस्ट में पाए जाने के रूप में भी सशर्त हैं: जेनकिंस पाइपलाइन सशर्त चरण / स्टेज


1
जबकि आपका उत्तर मान्य प्रतीत होता है (मैंने इसे किसी अन्य वर्कअराउंड के बाद से लाइव चेक नहीं किया है), मुझे नहीं लगता कि "ईमानदारी से आपको बाहर नहीं निकलना चाहिए" इसे शुरू करने का एक अच्छा तरीका है; स्पष्ट रूप से इन विधियों के अस्तित्व का मतलब है कि आईएस को कभी-कभी बाहर निकलना आवश्यक है।
एलेक्स

आप क्या सुझाव देंगे? एक समाप्ति बयान के लिए आगे बढ़ रहा है? क्वालीफायर "आम तौर पर" जोड़ना? आपने "प्रतिक्रिया" प्रदान की है, लेकिन यह मेरे लिए आसान नहीं है कि मैं यह इरादा बताऊं या कार्रवाई करूं, कृपया कम से कम हो।
Mresees 19

थोडा रुको। क्या यह आपका प्रश्न है? यदि यह है, तो टीबीएच आप सुनना नहीं चाहेंगे आप बाहर नहीं निकलना चाहिए, लेकिन न तो कोई तरीका है जिससे मैंने सुझाव दिया है कि वे निकास प्रदान करते हैं, वे कोड को चालू करते हैं ... सीधे मेरी स्थिति का समर्थन करते हैं।
MrMesees

1
आह, मैं देख रहा हूं, मुझे लगता है कि मैंने आपके बयान को गलत बताया है क्योंकि "काम खत्म करने के लिए कुछ करना बुरा है" के बजाय "आपको शाब्दिक exitआदेश का उपयोग नहीं करना चाहिए " - अगर मैं माफी चाहता हूं, तो यह मेरी गलतफहमी है।
एलेक्स

3
मैंने इसे स्पष्ट करने की कोशिश की है, इसके लिए माफी माँगने की कोई ज़रूरत नहीं है, भाषा एक चंचल जानवर है, विशेष रूप से इंटरनेट पर :)
MrMesees

0

Executor.interrupt(Result)विधि साफ, सबसे सीधा तरीका मैं एक निर्माण को समय से पहले बंद करने के लिए मिल सकता है है और एक सफलता के रूप में चिह्नित।

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

पेशेवरों :

  • एक घोषणात्मक पाइपलाइन में काम करता है और साथ ही एक पटकथा भी।
  • संभालने की कोई कोशिश / कैच या अपवाद नहीं।
  • UI में ग्रीनिंग / पासिंग के रूप में कॉलिंग चरण और किसी भी क्रमिक चरणों को चिह्नित करता है।

विपक्ष :

  • असुरक्षित समझी जाने वाली एक सहित कई इन-प्रोसेस स्क्रिप्ट स्वीकृतियों की आवश्यकता होती है । स्वीकृत और सावधानी के साथ उपयोग करें।

मेरे लिए यह काम नहीं करता है - लगातार चरणों को निष्पादित किया जा रहा है।
Łukasz K
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.