एक्सक्यूट शैल कैसे / कब जेनकिन्स में विफलता के रूप में एक निर्माण को चिह्नित करता है?


112

इस एक के जवाब की खोज करते हुए मुझे मिली डरावनी कहानियाँ ...

ठीक है, मेरे पास एक .sh स्क्रिप्ट है जो बहुत कुछ करती है जो जेनकिंस करने वाले हैं:

  • SVN से स्रोतों की जाँच करें
  • परियोजना का निर्माण
  • परियोजना को तैनात करता है
  • खुद के बाद साफ करता है

इसलिए जेनकिंस में मुझे केवल एग्ज़िक्यूट शेल कमांड में स्क्रिप्ट चलाकर प्रोजेक्ट का निर्माण करना है। स्क्रिप्ट को चलाया जाता है (स्रोत डाउनलोड किए जाते हैं, प्रोजेक्ट बिल्ड / परिनियोजित होता है) लेकिन फिर यह बिल्ड को विफलता के रूप में चिह्नित करता है: बिल्ड स्टेप 'एक्सक्यूट शेल ’विफलता के रूप में निर्मित बिल्ड को चिह्नित करता है, भले ही स्क्रिप्ट सफलतापूर्वक चली हो! मैंने स्क्रिप्ट को बंद करने की कोशिश की:

  • बाहर निकलें 0 (अभी भी यह विफलता के रूप में चिह्नित है)
  • बाहर निकलें 1 (यह विफलता के रूप में चिह्नित करता है, उम्मीद के मुताबिक)
  • कोई निकास आदेश बिल्कुल नहीं (इसे विफलता के रूप में चिह्नित करें)

कब, कैसे और क्यों Execute Shell मेरे निर्माण को विफलता के रूप में चिह्नित करता है?

जवाबों:


131

सबसे पहले चीजें, नीचे के ग्रे क्षेत्र पर माउस को घुमाएं। जवाब का हिस्सा नहीं है, लेकिन बिल्कुल कहा जाना है:

यदि आपके पास एक शेल स्क्रिप्ट है जो सभी के द्वारा "चेकआउट, निर्माण, तैनाती" करता है, तो आप जेनकिंस का उपयोग क्यों कर रहे हैं? आप जेनकिंस की सभी विशेषताओं को आगे बढ़ा रहे हैं जो इसे बनाते हैं। आपके पास एक क्रोन या एसवीएन पोस्ट-कम हुक हो सकता है जो स्क्रिप्ट को सीधे कॉल करता है। एसवीएन चेकआउट का प्रदर्शन करने वाली जेनकिंस अपने आप में महत्वपूर्ण है। यह बिल्डरों को केवल तभी ट्रिगर करने की अनुमति देता है जब परिवर्तन होते हैं (या टाइमर पर, या मैनुअल, यदि आप चाहें तो)। यह बनाता है के बीच परिवर्तन का ट्रैक रखता है। यह उन परिवर्तनों को दर्शाता है, इसलिए आप देख सकते हैं कि कौन सा निर्माण परिवर्तन के किस सेट के लिए था। यह तब शुरू होता है जब उनके परिवर्तन सफल या असफल निर्माण का कारण बनते हैं (फिर से, जैसा कि आप चाहें) कॉन्फ़िगर किया गया है। यह कमिटर्स को ईमेल करेगा जब उनके फिक्स ने फेलिंग बिल्ड को ठीक किया। और तो और। जेनकींस ने कलाकृतियों को संग्रहित करते हुए, उन्हें सीधे जेनकिंस से सीधे प्रति बिल्ड पर उपलब्ध कराया। एसवीएन चेकआउट जितना महत्वपूर्ण नहीं है, यह एक बार फिर से जेनकींस का एक अभिन्न हिस्सा है। तैनाती के साथ ही। जब तक आपके पास एक एकल वातावरण नहीं है, तब तक तैनाती आमतौर पर कई वातावरणों में होती है। जेनकिन्स किस माहौल का एक विशिष्ट निर्माण (एसवीएन परिवर्तन के विशिष्ट सेट के साथ) रख सकते हैं, प्रचार के उपयोग के माध्यम से इसे तैनात किया जाता है। आप इस सब को आगे बढ़ा रहे हैं। ऐसा लगता है जैसे आपको बताया गया है कि "आपको जेनकिंस का उपयोग करना है" लेकिन आप वास्तव में नहीं चाहते हैं, और आप यह कर रहे हैं कि आप अपने मालिकों को अपनी पीठ से हटा दें, बस एक चेकमार्क "हाँ, मैंने जेनकिंस का उपयोग किया है"

संक्षिप्त उत्तर है: जेनकिन के एक्सक्यूट शेल बिल्ड स्टेप के अंतिम कमांड का एक्जिट कोड वही है जो बिल्ड स्टेप की सफलता / विफलता को निर्धारित करता है । - सफलता, - विफलता। ध्यान दें, यह बिल्ड स्टेप की सफलता / असफलता का निर्धारण कर रहा है , न कि पूरी नौकरी चलाने का । पूरी तरह से काम चलाने की सफलता / विफलता कई बिल्ड चरणों और पोस्ट-बिल्ड कार्यों और प्लगइन्स से प्रभावित हो सकती है।0anything else

आपने उल्लेख किया है Build step 'Execute shell' marked build as failure, इसलिए हम केवल एक निर्माण कदम पर ध्यान केंद्रित करेंगे। यदि आपके Execute शेल बिल्ड स्टेप में केवल एक ही लाइन है जो आपके शेल स्क्रिप्ट को कॉल करती है, तो आपकी शेल स्क्रिप्ट का एक्जिट कोड बिल्ड स्टेप की सफलता / विफलता को निर्धारित करेगा। यदि आपकी शेल स्क्रिप्ट निष्पादन के बाद , आपके पास अधिक लाइनें हैं, तो उन्हें सावधानीपूर्वक समीक्षा करें, क्योंकि वे ऐसे हैं जो विफलता का कारण बन सकते हैं।

अंत में, यहाँ पढ़ें जेनकींस बिल्ड स्क्रिप्ट गूगल टेस्ट निष्पादन के बाद बाहर निकलता है । यह सीधे आपके प्रश्न से संबंधित नहीं है, लेकिन ध्यान दें कि जेनकिन्स ने शेल स्क्रिप्ट के रूप में Execute Shell build step को लॉन्च करने के बारे में बताया/bin/sh -xe

इसका -eमतलब है कि शेल स्क्रिप्ट विफलता के साथ बाहर निकल जाएगी , भले ही सिर्फ 1 कमांड विफल हो, भले ही आप उस कमांड के लिए त्रुटि जांच करें (क्योंकि स्क्रिप्ट आपकी त्रुटि जांच से पहले निकल जाती है)। यह शेल स्क्रिप्ट के सामान्य निष्पादन के विपरीत है, जो आमतौर पर असफल कमांड के लिए त्रुटि संदेश को प्रिंट करता है (या इसे अन्य तरीकों से इसे शून्य करने और संभालने के लिए पुनर्निर्देशित करता है), और जारी रखें।

इसे दरकिनार करने के लिए, set +eअपने शेल स्क्रिप्ट के शीर्ष पर जोड़ें ।

चूँकि आप कहते हैं कि आपकी स्क्रिप्ट वह सब करती है जो वह करने वाला है, संभावना है कि स्क्रिप्ट के अंत में फेलिंग कमांड कहीं है। शायद एक अंतिम गूंज? या कहीं कलाकृतियों की कॉपी? पूर्ण कंसोल आउटपुट को देखे बिना, हम केवल अनुमान लगा रहे हैं।

कृपया जॉब रन के कंसोल आउटपुट को पोस्ट करें, और अधिमानतः शेल स्क्रिप्ट को भी। और फिर हम आपको बता सकते हैं कि कौन सी लाइन विफल हो रही है।


6
जेनकिंस का उपयोग करने का कारण अभी भी मेरे लिए अस्पष्ट है ... ऐसा लगता है कि शीर्ष पर मौजूद किसी व्यक्ति को यह समझ में नहीं आया कि हमारे पास पहले से ही यह स्क्रिप्ट है और जोर देकर हम जेनकिंस का उपयोग करते हैं। मुझे लगता है कि मैं दिलबर्ट स्ट्रिप में हूं। -ई टिप के लिए धन्यवाद। इसने समस्या को हल किया
परीक्षक

45
जेनकिंस का उपयोग करने के लिए अभी भी अच्छे कारण हैं: ऑडिट ट्रेल, स्टेटस विजिबिलिटी, आदि। यदि आपके पास पहले से ही एक बिल्ड स्क्रिप्ट है, तो जेनकिंस सुविधाओं का लाभ उठाने के लिए इसे वापस लेने से पहले जेनकींस पर जाना एक अच्छा पहला कदम है।
ऐहलके

3
इस उत्तर को जोड़ने वाले क्रॉस सर्वरफॉल्ट . com/a/143576/186454 सेट + ई और सेट -ई को आपकी स्क्रिप्ट में कहीं भी निर्दिष्ट किया जा सकता है। बीच में कोई भी कोड बिल्ड को विफल नहीं करेगा यदि लौटाया गया मान 0. नहीं है
एलेक्स स्क्रीपनीक

2
शैल स्क्रिप्ट बनाम
जेनकींस

हम प्रमाणीकृत पहुँच और नौकरी के लिए UI प्रदान करने के लिए जेनकिंस का उपयोग करते हैं। एक क्रोन इसे काट नहीं करेगा। जेनकिंस सिर्फ cripts नहीं चलाता है।
ffghfgh

90

आपके प्रश्न का सरल और संक्षिप्त उत्तर है

कृपया अपने "एक्ज़िक्यूट शेल" बिल्ड स्टेप में निम्न पंक्ति जोड़ें।

#!/bin/sh

अब मैं आपको इसका कारण बताता हूं कि हमें "एक्ज़क्यूट शेल" बिल्ड जॉब के लिए इस लाइन की आवश्यकता क्यों है।

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

इसलिए #!/bin/shवसीयत जोड़कर आप बिना किसी विकल्प के निष्पादित कर सकते हैं।


4
Upvoted। Didx को -xe डिफ़ॉल्ट के बारे में पता है। जब मेरे grep कमैन को एक स्ट्रिंग नहीं मिल रही थी, तो मेरी पूरी स्क्रिप्ट विफल हो गई क्योंकि grep ने एक गैर 0 रिटर्न मान दिया :)
Somaiah Kumbera

बढ़िया काम किया! मेरे गैर-महत्वपूर्ण कदमों पर इसका उपयोग करते हुए, एक सफाई कदम जो सिर्फ कुछ ऐसा करता है find . -name 'bower_components' -exec rm {} \;और कुछ मामलों में, यह असफल रहा। धन्यवाद!
yorch

इसने सबकुछ साफ़ कर दिया - 'और दूसरा विकल्प -e, जो शेल को स्क्रिप्ट को चलाने से रोकने का कारण बनता है जब कोई भी आदेश गैर-शून्य (जब कोई भी कमांड विफल हो जाता है) से बाहर निकलें कोड निकलता है।'
परमवीर सिंह करवाल

3

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

यदि आपकी स्क्रिप्ट में एक पंक्ति है जहां विफलता की उम्मीद है, जैसे एक grep या एक खोज, तो बस || trueउस पंक्ति के अंत में जोड़ें । यह सुनिश्चित करता है कि रेखा हमेशा सफलता लौटाएगी।

यदि आपको उस एग्जिट कोड का उपयोग करने की आवश्यकता है, तो आप अपने स्टेटमेंट में या तो कमांड को फहरा सकते हैं:

grep foo bar; if [ $? == 0 ]; then ...    -->   if grep foo bar; then ...

या आप अपने ||क्लॉज में रिटर्न कोड कैप्चर कर सकते हैं :

grep foo bar || ret=$?

1
धन्यवाद ब्रायन। आपने मेरा दिन बचाया। इसके अलावा, मुझे लगता है कि दोनों -x और -e को चालू करना अच्छा है। ताकि आप अपने जेनकींस लॉग में देखें।
बिकल बेसनेट

2

सादा और सरल:

यदि जेनकिंस गैर-शून्य कोड के साथ बिल्ड स्टेप (जो एक स्क्रिप्ट भी है) से बाहर निकलता है, तो बिल्ड को लाल गेंद (= विफल) के साथ चिह्नित किया गया है।

ऐसा क्यों होता है यह आपकी बिल्ड स्क्रिप्ट पर निर्भर करता है।

मैंने दूसरे दृष्टिकोण से भी ऐसा ही कुछ लिखा है, लेकिन शायद इसे वैसे भी पढ़ने में मदद मिलेगी: जेनकिन्स को मेरा निर्माण सफल क्यों लगता है?


0

इसलिए #!/bin/shवसीयत जोड़कर आप बिना किसी विकल्प के निष्पादित कर सकते हैं।

इसने मुझे एक समस्या को ठीक करने में भी मदद की जहां मैं अपने लिनक्स दास पर जेनकिंस मास्टर से बैश स्क्रिप्ट निष्पादित कर रहा था। #!/bin/bash"एक्ज़िक्यूट शेल" ब्लॉक में अपनी वास्तविक स्क्रिप्ट के ऊपर जोड़कर, इसने मेरी समस्या को ठीक कर दिया, अन्यथा यह विंडोज़ गिट को निष्पादित कर रहा था, बश शेल का संस्करण जो एक त्रुटि दे रहा था।


0

जेनकिंस वेर में। 1.635, इस तरह से एक देशी पर्यावरण चर दिखाना असंभव है:

$BUILD_NUMBER or ${BUILD_NUMBER}

इस स्थिति में, आपको इसे अन्य चर में सेट करना होगा।

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