2009-09-03 4 views
31

मैं बिल्ड प्रक्रिया को स्वचालित करने के लिए एक बैश स्क्रिप्ट लिख रहा हूं। दो प्रमुख बिल्ड ब्लॉक हैं, एक चींटी कार्य है और एक सादा पुराना "एमवीएन क्लीन इंस्टॉल" है। मैं कुछ ऐसा करना चाहता हूं जब इन दो निर्माण प्रक्रियाओं में से कोई भी निर्माण त्रुटि उत्पन्न हो।एक बैश स्क्रिप्ट के माध्यम से चींटी/मैवेन से बिल्ड त्रुटि का पता लगाने के लिए कैसे?

और समस्या यह है कि इन बिल्डों में परीक्षण विफलताओं या समय-समय पर त्रुटियां होंगी, लेकिन अंतिम परिणाम सफल होता है। और मेरा मानना ​​है कि इन प्रक्रियाओं द्वारा स्थिति कोड ($?) वापस होना चाहिए 0 चाहे निर्माण विफल हो या सफल हो, मैं गलत हो सकता था।

तो मध्य स्क्रिप्ट (टेस्ट त्रुटियों, आदि) के दौरान झूठी जानकारी को पकड़ने के बिना अंतिम परिणाम (विफल/सफल बनाने) का पता लगाने के लिए मेरी स्क्रिप्ट का सबसे अच्छा तरीका क्या है?

+2

उपकरण उचित निकास स्थिति वापस करनी चाहिए। – derobert

+0

मुझे वास्तव में यकीन नहीं है कि चींटी/मेवेन के लिए बाहर निकलने की स्थिति क्या है, मुझे लगता है कि वे 0 वापस भी असफल हो जाएंगे। तो क्या आप कह रहे हैं कि बिल्ड विफल होने पर वे शून्य-शून्य मान वापस कर देंगे? इससे मेरा जीवन बहुत आसान हो जाएगा। – fei

+0

यदि आपके परीक्षण कभी-कभी पास होते हैं और कभी-कभी असफल होते हैं और आप किसी भी तरह से परवाह नहीं करते हैं, तो उन्हें अपने निर्माण के हिस्से के रूप में क्यों परेशान करते हैं? –

उत्तर

4

Ant manual के अनुसार:

चींटी स्क्रिप्ट (उनके Windows और यूनिक्स संस्करण में) शुरू जावा कार्यक्रम की वापसी कोड लौटाते हैं। तो एक सफल निर्माण 0 रिटर्न, असफल अन्य मूल्यों को वापस करने में विफल बनाता है।

मैवेन त्रुटि पर एक गैर-शून्य निकास कोड भी देता है। यहां a link दिखा रहा है कि मेवेन आमंत्रण API का उपयोग करके इस स्थिति से पूछताछ कैसे करें।

तो ऐसा लगता है कि आपको अपनी स्क्रिप्ट में रिटर्न कोड को स्पष्ट रूप से संभालने में सक्षम होना चाहिए। संभवतः आप परीक्षण आदि से संबंधित त्रुटि कोडों को अनदेखा कर सकते हैं यदि वे आपकी चिंता नहीं करते हैं।

exec चींटी में त्रुटि कोड सिस्टम-विशिष्ट ऑपरेटिंग हैं। ये आपकी मदद कर सकता है:

3

यहाँ वास्तव में क्या मैं आपका इच्छित परिणाम प्राप्त करने के लिए करते हैं।

<exec executable="${env.M2_HOME}/bin/mvn" dir="${basedir}" 
      failonerror="true" osfamily="unix"> 
     <arg value="-DskipTests=${argSkipTests}"/> 
     <arg value="-Doffline=${argOffline}"/> 
     <arg line="${projectsLine}"/> 
     <arg line="${resumeFromLine}"/> 
     <arg line="${alsoMakeLine}"/> 
     <arg line="${alsoMakeDependentsLine}"/> 
     <arg line="${commandsLine}"/> 
    </exec> 
11

Maven 2 के खिलाफ कुछ मुद्दों गलत वापसी कोड लौटने (अर्थात हमेशा 0 लौटने) कर रहे हैं। विशेष रूप से MNG-3651 जो मेवेन 2.0.9 में तय किया गया था।

exit /B %ERROR_CODE% 

Maven 2.0.9 के बाद से, अंतिम पंक्ति इस में बदल गया था:

cmd /C exit /B %ERROR_CODE% 

तो एक गैर 0

पुराने संस्करणों में, mvn.bat इस लाइन के साथ समाप्त हुआ बिल्ड विफल होने पर वापसी कोड वापस कर दिया जाता है। निर्माण ईआरआरओआर के मामले में रिटर्न कोड 1 है। यदि आप 2.0.9+ में अपग्रेड करने में असमर्थ हैं, तो आप सही कोड वापस करने के लिए ऊपर के रूप में mvn.bat को संशोधित करने पर विचार कर सकते हैं।

36
mvn clean test 
rc=$? 
if [[ $rc -ne 0 ]] ; then 
    echo 'could not perform tests'; exit $rc 
fi 
+4

यदि आप इस उत्तर पर अधिक विस्तृत कर सकते हैं तो यह बहुत बेहतर होगा। यह अन्य प्रश्नों के मुकाबले प्रश्न का उत्तर कैसे और क्यों करता है? – nietonfir

+1

मुझे यह जवाब सबसे अच्छा लगता है। मैं एक bash स्क्रिप्ट में एमवीएन से त्रुटि कोड को संभालने के लिए googled और रेनाड का जवाब पूरी तरह से बिल फिट बैठता है। मुझे संदेह है कि फेई इस तकनीक की तरह इस तकनीक का उपयोग करके समाप्त हो गया है कि एमवीएन परीक्षण विफलताओं के लिए एक गैर शून्य कोड लौटाएगा। –

+0

लगभग बिल्कुल सही - लेकिन यदि आप वास्तव में उस स्ट्रिंग तुलना करना चाहते हैं तो मैं उद्धरणों का उपयोग करूंगा (https://www.gnu.org/software/bash/manual/bashref.html/"==" के लिए खोजें) देखें, या "-ne", जो तुलनात्मक ऑपरेटर (unquoted) पूर्णांक के लिए है। – cslotty

संबंधित मुद्दे