2012-11-15 13 views
6

के बाद निकलता है मैं जेनकींस के माध्यम से एक क्यूटी जीयूआई एप्लिकेशन बना रहा हूं। मैं 3 निर्माण चरणों कहा:जेनकिंस बिल्ड स्क्रिप्ट Google टेस्ट निष्पादन

  • परीक्षण निष्पादन
  • बिल्डिंग परीक्षण निष्पादन
  • रनिंग gcovr

के साथ एक कवरेज रिपोर्ट संकलन किसी कारण, परीक्षण निष्पादन योग्य चलाने के लिए खोल कार्य के लिए निष्पादन के बाद बंद हो जाता है। यहां तक ​​कि एक साधारण echo भी नहीं चला है। परीक्षण Google टेस्ट और आउटपुट xUnit XML फ़ाइलों के साथ लिखे गए हैं, जिनका निर्माण के बाद विश्लेषण किया जाता है। कुछ परीक्षण एप्लिकेशन यूजर इंटरफेस शुरू करते हैं, इसलिए मैंने उन्हें चलाने के लिए जेनकिन्स xvnc प्लगइन स्थापित किया।

निर्माण कार्य इस प्रकार हैं:

बिल्ड

cd $WORKSPACE/projectfiles/QMake 
sh createbin.sh 

टेस्ट

cd $WORKSPACE/bin 
./Application --gtest_output=xml 

कवरेज रिपोर्ट

cd $WORKSPACE/projectfiles/QMake/out 
gcovr -x -o coverage.xml 

अब, पहले निर्माण कार्य के अंत में echo सही ढंग से मुद्रित है, लेकिन दूसरे के अंत में echo नहीं है। इसलिए तीसरा निर्माण कार्य तब भी नहीं चलाया जाता है, हालांकि Google टेस्ट आउटपुट दिखाई देता है। मैंने सोचा कि शायद समस्या यह है कि कुछ Google टेस्ट विफल हो जाते हैं, लेकिन स्क्रिप्ट क्यों निष्पादित हो सकती है क्योंकि परीक्षण विफल हो जाते हैं?

शायद कोई मुझे यह संकेत दे सकता है कि दूसरा कार्य क्यों बंद हो जाता है।

संपादित

सांत्वना उत्पादन इस तरह दिखता है:

Updating svn://repo/ to revision '2012-11-15T06:43:15.228 -0800' 
At revision 2053 
no change for svn://repo/ since the previous build 
Starting xvnc 
[VG5] $ vncserver :10 

New 'ubuntu:10 (jenkins)' desktop is ubuntu:10 

Starting applications specified in /var/lib/jenkins/.vnc/xstartup 
Log file is /var/lib/jenkins/.vnc/ubuntu:10.log 

[VG5] $ /bin/sh -xe /tmp/hudson7777833632767565513.sh 
+ cd /var/lib/jenkins/workspace/projectfiles/QMake 
+ sh createbin.sh 
... Compiler output ... 
+ echo Build Done 
Build Done 
[VG5] $ /bin/sh -xe /tmp/hudson4729703161621217344.sh 
+ cd /var/lib/jenkins/workspace/VG5/bin 
+ ./Application --gtest_output=xml 
Xlib: extension "XInputExtension" missing on display ":10". 
[==========] Running 29 tests from 8 test cases. 
... Test output ... 
3 FAILED TESTS 
Build step 'Execute shell' marked build as failure 
Terminating xvnc. 
$ vncserver -kill :10 
Killing Xvnc4 process ID 1953 
Recording test results 
Skipping Cobertura coverage report as build was not UNSTABLE or better ... 
Finished: FAILURE 

उत्तर

22

आम तौर पर, अगर एक कदमबिल्ड विफल रहता है, बाकी निष्पादित नहीं किया जाएगा। अपनी लॉग से इस लाइन के लिए

वेतन ध्यान:

[VG5] $ /bin/sh -xe 

-x खोल प्रिंट क्रियान्वयन से पहले कंसोल में प्रत्येक आदेश में आता है।
-e किसी आदेश में विफल होने पर त्रुटि के साथ खोल निकास बनाता है।

इस मामले में एक "असफल", किसी भी व्यक्तिगत आदेश से 0 का रिटर्न कोड नहीं होगा।
आप इस सीधे मशीन पर चल कर इसकी पुष्टि कर सकते हैं:

./Application --gtest_output=xml 
echo $? 

तो echo $? प्रदर्शित करता है 0, यह पिछले आदेश के सफल समापन इंगित करता है। अगर यह किसी और चीज को प्रदर्शित करता है, तो यह पिछले कमांड से एक त्रुटि कोड इंगित करता है (से।/ आवेदन), और जेनकिंस इस तरह से व्यवहार करता है।

अब, यहां कई चीजें हैं। पहला यह है कि आपका दूसरा बिल्ड चरण (अनिवार्य रूप से एक अस्थायी खोल स्क्रिप्ट /tmp/hudson4729703161621217344.sh) विफल होने पर सेट हो जाता है यदि कोई आदेश विफल रहता है (डिफ़ॉल्ट व्यवहार)। जब बिल्ड स्टेप विफल हो जाता है, तो जेनकींस रुक जाएंगे और पूरे काम में असफल हो जाएंगे।

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

हालांकि, स्क्रिप्ट का समग्र परिणाम (बिल्ड चरण) अंतिम आदेश का निकास कोड है। चूंकि आपके ओपी में, आपके पास केवल स्क्रिप्ट में 2 कमांड हैं, और आखिरी असफल हो रहा है, यह आपके द्वारा जोड़े गए +x के बावजूद पूरी स्क्रिप्ट (चरण चरण) को विफलता माना जाएगा। ध्यान दें कि यदि आप तीसरे कमांड के रूप में echo जोड़ते हैं, तो यह वास्तव में काम करेगा, क्योंकि अंतिम स्क्रिप्ट कमांड (गूंज) सफल रहा था, हालांकि यह "वर्कअराउंड" आपको आवश्यक नहीं है।

आपको अपनी स्क्रिप्ट में उचित त्रुटि प्रबंधन जोड़ने की आवश्यकता है। इस पर विचार करें:

set +e 
cd $WORKSPACE/bin && ./Application --gtest_output=xml 
if ! [ $? -eq 0 ]; then 
    echo "Tests failed, however we are continuing" 
else 
    echo "All tests passed" 
fi 

तीन बातें लिपि में हो रही हैं:

  1. सबसे पहले, हम अलग-अलग आदेशों

  2. तो मैं बुनियादी जोड़ दिया है की विफलता पर बाहर निकलने के लिए नहीं खोल कह रहे हैं दूसरी पंक्ति में त्रुटि प्रबंधन। && का अर्थ है "./Application निष्पादित करें यदि पिछले cd सफल था। आप कभी नहीं जानते, शायद बिन फ़ोल्डर गुम है, या जो भी हो सकता है। बीटीडब्ल्यू, && आंतरिक रूप से उसी त्रुटि कोड पर काम करता है 0 सिद्धांत

  3. आखिरकार, अब ./Application के परिणाम के लिए उचित त्रुटि हैंडलिंग है। यदि परिणाम 0 नहीं है, तो हम दिखाते हैं कि यह असफल रहा है, अन्यथा हम दिखाते हैं कि यह पारित हो गया है। ध्यान दें, आखिरी आदेश के बाद से एक (संभावित रूप से) ./Application विफल नहीं है, लेकिन echo किसी भी अन्य संभावनाओं से, स्क्रिप्ट का समग्र परिणाम (निर्मित चरण) एक सफलता (यानी 0) होगा, और अगला बिल्ड चरण निष्पादित किया जाएगा।

बीटीडब्ल्यू, आप अपने सभी बिल्ड चरणों को उचित त्रुटि प्रबंधन के साथ एक एकल निर्माण चरण में भी डाल सकते हैं।

हां ... यह उत्तर आवश्यकतानुसार थोड़ा लंबा हो सकता है, लेकिन मैं चाहता था कि आप समझें कि जेनकिंस और शैल कैसे निकास कोड का इलाज करते हैं।

+1

उत्कृष्ट उत्तर, मैंने वास्तव में इस संभावना के बारे में नहीं सोचा था कि प्रत्येक संभावित आदेश स्क्रिप्ट को रोक सकता है। धन्यवाद! – dasmaze

+1

इच्छा है कि मैं आपको 10 बार बढ़ा सकता हूं। इसके लिए बहुत कुछ है !!! – nolazybits

+0

@zeflasher, आप हमेशा मुझे जवाब के लिए एक बक्षीस असाइन कर सकते हैं;) – Slav

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