यदि शैल निष्पादित नहीं होती है तो जेनकिन्स का निर्माण न करें


132

मेरी निर्माण प्रक्रिया के हिस्से के रूप में, मैं एक निष्पादित शेल चरण के रूप में एक कमिट कमिट चला रहा हूं। हालाँकि, यदि कार्यक्षेत्र में कोई परिवर्तन नहीं हैं, तो जेनकिन्स बिल्ड में विफल हो रहा है। ऐसा इसलिए है क्योंकि जब कोई परिवर्तन करने के लिए परिवर्तन नहीं होते हैं तो git एक त्रुटि कोड लौटाता है। मैं या तो बिल्ड को समाप्त करना चाहता हूं, या यदि यह मामला है तो इसे अस्थिर के रूप में चिह्नित करें। कोई विचार?


जाँच करें कि क्या कुछ करना है, और केवल उन मामलों में प्रतिबद्ध हैं? stackoverflow.com/questions/5139290/…
एंडर्स लिंडहल

जवाबों:


210

आदेश के विफल होने पर आगे निष्पादन को रोकने के लिए :

command || exit 0

कमांड के विफल होने पर निष्पादन जारी रखने के लिए :

command || true


12
आपको || exit 0पहले मामले में ज़रूरत नहीं है , यदि commandरिटर्न गलत है तो निष्पादन बंद हो जाएगा। उस ने कहा, दूसरा विकल्प बहुत मददगार है!
नीर अल्फ़ासी

20
@alfasin आप समस्या को नहीं समझते हैं। ओपी नहीं चाहता कि जेनकिंस का निर्माण विफल हो; एर्गो हमें चाहिए exit 0क्योंकि कोई भी गैर-शून्य निकास कोड बिल्ड को विफल कर देगा।
क्वोलोन प्रश्न

1
मैं देखता हूं, उस स्थिति में मैं शब्दांकन को बदल दूंगा: "कमांड के विफल होने पर आगे के निष्पादन को रोकने के लिए:" से: "कमांड के विफल होने पर आगे के निष्पादन को रोकने के लिए और जेनकिंस की नौकरी को सफल के रूप में चिह्नित करें:"।
निर अल्फ़ासी

1
@alfasin जबकि मैं मानता हूँ कि क्वोलोन प्रश्न तड़क-भड़क वाली टिप्पणी अव्यवसायिक थी, उन्होंने जो कहा उसमें सही था। "बाहर निकलें 0" काम को सफल नहीं करेगा। यह सिर्फ वर्तमान बिल्ड चरण को सफल होने के लिए चिह्नित करेगा। अगले बिल्ड चरणों में से एक पर काम अभी भी विफल हो सकता है।
noamik

1
धन्यवाद यह काम किया! यह विशेष रूप से "ssh का उपयोग कर दूरस्थ होस्ट पर निष्पादन शेल" प्लगइन सुविधा के लिए उपयोगी है क्योंकि आप त्रुटि पर असफल नहीं होने के लिए / बिन / बैश + ई का उपयोग करने में सक्षम नहीं हैं। मुझे यह विचार भी पसंद है कि मुझे यह चुनना है कि कौन सी कमांड बिल्ड को विफल नहीं करती है।
लेमन 24

80

जेनकिन्स प्रयोग करके शेल बिल्ड चरणों का निष्पादन कर रहा है /bin/sh -xe डिफ़ॉल्ट रूप से करके है। -xहर कमांड को प्रिंट करने का मतलब है। -eयदि स्क्रिप्ट की कोई भी कमांड विफल हो जाती है तो विफलता से बाहर निकलने का मतलब है।

तो मुझे लगता है कि आपके मामले में क्या हुआ 1 के साथ आपका git कमांड एग्जिट है, और डिफ़ॉल्ट -eपैरामम के कारण, शेल नॉन-0 एग्जिट कोड को चुनता है, बाकी स्क्रिप्ट को अनदेखा करता है और स्टेप को विफलता के रूप में चिह्नित करता है। हम इसकी पुष्टि कर सकते हैं यदि आप अपनी बिल्ड स्टेप स्क्रिप्ट यहां पोस्ट कर सकते हैं।

अगर ऐसा है, तो आप इसे लगाने की कोशिश कर सकते हैं #!/bin/shताकि स्क्रिप्ट बिना विकल्प के निष्पादित हो जाएगी; या एset +e इस व्यवहार को ओवरराइड करने के लिए बिल्ड स्टेप के शीर्ष पर समान या कुछ भी करें।


संपादित: एक और बात ध्यान देने योग्य है, यदि आपके शेल स्क्रिप्ट में अंतिम कमांड नॉन-० कोड देता है , तब भी पूरा बिल्ड स्टेप इस सेटअप के साथ फेल के रूप में चिह्नित किया जाएगा। इस मामले में, आप इससे echoबचने के लिए अंत में एक कमांड डाल सकते हैं ।

एक और संबंधित प्रश्न


41

यदि git रिटर्न से बाहर निकलने की स्थिति को धक्का देने के लिए कुछ भी नहीं है 1. निष्पादित शेल बिल्ड चरण को क्रमशः विफल के रूप में चिह्नित किया गया है। आप OR स्टेटमेंट का उपयोग कर सकते हैं || (डबल पाइप)।

git commit -m 'some messasge' || echo 'Commit failed. There is probably nothing to commit.'

इसका अर्थ है, यदि पहले विफल हो गया है तो दूसरा तर्क निष्पादित करें (निकास स्थिति> 0)। दूसरी कमांड हमेशा वापस आती है। 0. जब पुश करने के लिए कुछ नहीं होता है (निकास स्थिति 1 -> दूसरी कमांड निष्पादित करें) प्रतिध्वनि 0 वापस आएगी और स्टेप जारी रहेगा।

निर्माण को अस्थिर के रूप में चिह्नित करने के लिए आप पोस्ट-बिल्ड चरण जेनकिंस पाठ खोजक का उपयोग कर सकते हैं। यह कंसोल आउटपुट, मैच पैटर्न (आपकी प्रतिध्वनि) के माध्यम से जा सकता है और अस्थिर के रूप में निर्माण कर सकता है।


27

जेनकिंस को असफल नहीं बताने का एक और आसान तरीका है। आप एक निर्माण चरण में अपनी प्रतिबद्धता को अलग कर सकते हैं और असफल नहीं होने के लिए शेल सेट करें:

set +e
git commit -m "Bla."
set -e

2
set -eउस आदेश के बाद जोड़ना सुनिश्चित करें जिसे आप निकास कोड के बावजूद चलाना चाहते हैं। अन्यथा, आप उन कमांड को निष्पादित कर सकते हैं जिन्हें आप करने का इरादा नहीं रखते हैं। मैं स्वयं त्रुटि को संभालना चाहता था, इसलिए मैंने कुछ ऐसा किया: `सेट + ई कमिट-एम" ब्ला "एक्ज़िट_कोडे =" $ {?} "सेट-ई # एक्जिट कोड
लॉजिक`

8

जेनकिन्स कदम की वापसी मूल्य द्वारा एक कदम की सफलता / विफलता को निर्धारित करता है। शेल के मामले के लिए, यह अंतिम मान का रिटर्न होना चाहिए। Windows CMD और (POSIX) बैश शेल दोनों के लिए, आपको exit 0अंतिम कमांड के रूप में उपयोग करके मैन्युअल रूप से रिटर्न वैल्यू सेट करने में सक्षम होना चाहिए ।


यह एक '' विंडोज़ विंडोज़ बैट 'के लिए काम नहीं करता है जिसमें 2 लाइनें हैं: git कमिट-एम "संदेश" एक्जिट 0
बेन

@ जब भी मैं exit 0अपने विंडोज जेनकींस इंस्टाल पर कई बिल्ड्स में " एग्जीक्यूटिव विंडो बैच कमांड" के साथ उपयोग करता हूं, और यह उम्मीद के मुताबिक काम करता है। कुछ और चल रहा होगा। क्या आप कंसोल लॉग के संबंधित भाग को पोस्ट कर सकते हैं?
जॉर्नर्नी

क्या आप इसे git कमिट-मी "blah" के साथ अपने पहले चरण में उपयोग कर रहे हैं? मैंने मशीन पर मैन्युअल रूप से एक बैट स्क्रिप्ट बनाने की कोशिश की, और गिट कमांड के बाद एक गूंज और एक निकास 0 लगाया। जब कुछ भी करने के लिए कुछ नहीं है, तो न तो अन्य कमांड चलाए जाते हैं ...
बेन

@Xiawei से उत्तर देखें। जेनकींस का डिफ़ॉल्ट व्यवहार एक ऐसे शेल को निष्पादित करने के लिए है #!/bin/sh -xvजिसके परिणामस्वरूप स्क्रिप्ट में कोई त्रुटि होने पर उसे रोक दिया जाता है।
स्टीवन आसानी से उपयोग होने वाला

8

मैं यहाँ पाए गए उत्तर का उपयोग करके इसे प्राप्त करने में सक्षम था:

कैसे एक त्रुटि के बिना कुछ करने के लिए प्रतिबद्ध है?

git diff --quiet --exit-code --cached || git commit -m 'bla'

1
उपरोक्त क्या है: " git diffकमांड करें, और यदि वह विफल हो जाता है, तो git commitकमांड करें। मूल रूप से, यह केवल कमिट करता है, अगर git diffकुछ करने के लिए मिला है। हालांकि @jwernerny का उत्तर सही था कि आपको exit 0अंतिम विवरण के रूप में जोड़ने में सक्षम होना चाहिए जेनकिंस बनाने के लिए किसी भी स्क्रिप्ट को इसे सफलता के रूप में माना जाता है। मैं एक परिदृश्य के बारे में सोच सकता हूं जहां यह असफल होगा यदि आप लिनक्स शेल चरण कर रहे थे, लेकिन बैच में यह हमेशा काम करना चाहिए।
स्लाव

@ बीन जेनकिंस /bin/sh -xeडिफ़ॉल्ट रूप से यहां (बीच में) बताए गए शेल का उपयोग करके चरणों का निष्पादन कर रहा है । तो आप इस व्यवहार को ओवरराइड करने के लिए बिल्ड स्टेप के शीर्ष पर रखने #!/bin/bashया करने की कोशिश कर सकते set +eहैं, जो शेष चरण को गैर-0 कोड के साथ बाहर निकलने के अंदर भी एक कमांड जारी रखेगा
Xiawei Zhang

8

शीर्षक में (अधिक सामान्य) प्रश्न - जेनकींस को असफल होने से रोकने के लिए आप इसे बाहर निकलने के कोड को देखने से रोक सकते हैं। 1. उदाहरण के लिए:

bash -c "ping 1.2.3.9999 -c 1; exit 0"

और अब आप पिंग का आउटपुट प्राप्त कर सकते हैं:

output=`bash -c "ping 1.2.3.9999 -c 1; exit 0"`

बेशक ping ...आप के बजाय किसी भी कमांड (एस) का उपयोग कर सकते हैं - सहित git commit



6

आप पाठ-खोजक प्लगइन का उपयोग कर सकते हैं । यह आपको अपनी पसंद की अभिव्यक्ति के लिए आउटपुट कंसोल की जांच करने की अनुमति देगा, फिर बिल्ड को चिह्नित करें Unstable


यह आशाजनक लग रहा था, लेकिन किसी कारण से यह निर्माण में विफल रहा।
बेन

4

कई शेल कमांड के लिए, मैं विफलताओं को जोड़कर अनदेखा करता हूं:

set +e commands true

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


मैं सामान्य रूप से परेशान-निराश करता हूं। यदि आप कुछ विशिष्ट कमांड के वापसी मूल्य को अनदेखा करना चाहते हैं, तो आप "|| true" या कुछ और सार्थक रिटर्निंग सही जोड़ सकते हैं, जैसे: stop-service.sh || इको सर्विस पहले से ही डाउन थी
राउल सालिनास-मोंटेगुडो

3

यदि आप इस कमांड को शेल ब्लॉक में रखते हैं:

false
true

आपके निर्माण को विफल (कम से कम 1 गैर-शून्य निकास कोड) के रूप में चिह्नित किया जाएगा, इसलिए आप इसे अनदेखा करने के लिए (सेट + ई) जोड़ सकते हैं:

set +e
false
true

असफल नहीं होगा। हालाँकि, यह जगह में (सेट + ई) के साथ भी विफल हो जाएगा:

set +e
false

क्योंकि अंतिम शेल कमांड को 0 से बाहर निकलना चाहिए।


2

यदि परिवर्तन होते हैं तो केवल कमिटमेंट के लिए निम्नलिखित काम करता है । तो कमिट फेल होने पर ही बिल्ड फेल होता है।

hg id | grep "+" || exit 0
hg commit -m "scheduled commit"

0

कुछ युक्तियों के साथ एक और उत्तर, किसी के लिए उपयोगी हो सकता है:

निम्नलिखित नियम के साथ अपने आदेशों को अलग करना याद रखें :

कमांड 1 और& command2 - इसका मतलब है, कि command2 निष्पादित किया जाएगा, केवल command1 सफलता अगर

कमांड 1 ;कमांड 2 - का मतलब है, कमांड 1 के परिणाम के बावजूद कमांड 2 को निष्पादित किया जाएगा

उदाहरण के लिए:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test ;set -e;echo 0 ", returnStdout: true).trim()
println run_tests 

विफल होने पर set -eऔर सफलतापूर्वक echo 0आदेशों के साथ निष्पादित किया जाएगा gmake test( यदि आपके परीक्षण विफल हुए), जबकि निम्न कोड छीन लिया गया था:

String run_tests = sh(script: "set +e && cd ~/development/tests/ && gmake test && set -e && echo 0 ", returnStdout: true).trim()
println run_tests 

एक सा गलत और आदेशों set -eऔर echo 0में && gmake test && set -e && echo 0साथ, छोड़ दिया जाएगा println run_testsबयान, कारण विफल gmake testजेनकींस निर्माण रद्द कर देगा। वर्कअराउंड के रूप में आप स्विच कर सकते हैं returnStatus:true, लेकिन फिर आप अपने कमांड से आउटपुट को याद करेंगे।


0

यह उत्तर सही है, लेकिन यह शेल कमांड के अंदर निर्दिष्ट || exit 0या नहीं || trueजाता है । यहाँ एक और पूर्ण उदाहरण है:

sh "adb uninstall com.example.app || true"

ऊपर काम करेगा, लेकिन निम्नलिखित विफल हो जाएगा:

sh "adb uninstall com.example.app" || true

शायद यह दूसरों के लिए स्पष्ट है, लेकिन मुझे यह महसूस करने से पहले बहुत समय बर्बाद किया।

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