2012-07-13 11 views
10

मुझे जेनकिन्स का उपयोग करना मुश्किल से शुरू हो गया है और यह अब तक की पहली समस्या है। मूल रूप से मेरी जेनकिन्स नौकरी हमेशा सफल होती है जब कुछ परीक्षणों में कोई त्रुटि हुई। यह वही है मैं खोल config में चल रहा हूँ है:जेनकिंस सफल होते हैं जब इकाई परीक्षण विफल रहता है (रेल)

bundle install 
rake db:migrate:reset 
rake test:units 
rake spec:models 

वह चीज जो जेनकींस केवल एक विफलता की रिपोर्ट जब कार्य जो विफल रहता है पिछले एक है। उदाहरण के लिए, यदि मैंने "रेक टेस्ट: इकाइयों" को अंतिम कार्य दिया है तो यह कुछ गलत होने पर त्रुटि को सूचित करेगा। इस कॉन्फ़िगरेशन का उपयोग करके मुझे केवल आरएसपीईसी परीक्षणों के लिए त्रुटि रिपोर्ट मिलती है लेकिन यूनिट परीक्षणों के लिए नहीं।

कोई भी सोच रहा है कि मैं न केवल आरएसपीईसी या यूनिट टेस्ट का उपयोग क्यों करता हूं, हम वर्तमान में rspec में माइग्रेट कर रहे हैं लेकिन यह समस्या अभी भी दर्दनाक है।

यह जेनकिन्सम से लॉग का हिस्सा है क्योंकि आप यूनिट परीक्षण में से एक को विफल कर सकते हैं लेकिन जेनकींस अभी भी सफलता के साथ खत्म हो गया है।

314 tests, 1781 assertions, 1 failures, 0 errors, 0 skips 
rake aborted! 
Command failed with status (1): [/var/lib/jenkins/.rvm/rubies/ruby-1.9.3-p1...] 

Tasks: TOP => test:units 
(See full trace by running task with --trace) 
Lot of rspec tests here.... 
Finished in 3.84 seconds 
88 examples, 0 failures, 42 pending 
Pushing HEAD to branch master of origin repository 
Pushing HEAD to branch master at repo origin 
Finished: SUCCESS 

उत्तर

18

जेनकींस आपके द्वारा एक अस्थायी फ़ाइल में लिखकर और फिर /bin/sh -xe का उपयोग करके स्क्रिप्ट चलाकर एक बिल्ड स्टेप बॉक्स में टाइप किए गए आदेश निष्पादित करता है।

आमतौर पर यह वांछित प्रभाव उत्पन्न करता है: कमांड को अनुक्रमित (और मुद्रित) में निष्पादित किया जाता है और जब आदेश विफल रहता है तो स्क्रिप्ट निरस्त हो जाता है यानी शून्य-शून्य निकास कोड से बाहर निकलता है।

यदि यह आपके साथ नहीं हो रहा है, तो एकमात्र कारण यह हो सकता है कि आपने इस व्यवहार को ओवरराइड कर दिया है। आप अपने दो चरणों के साथ अपने बिल्ड चरण की पहली पंक्ति शुरू करके इसे ओवरराइड कर सकते हैं: #!

उदाहरण के लिए, अपने कदम बिल्ड इस तरह दिखता है:

#!/bin/bash 
bundle install 
rake db:migrate:reset 
rake test:units 
rake spec:models 

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

तो, बिल्ड स्टेप की पहली पंक्ति पर जो भी आपने रखा है उस पर ध्यान दें। यदि आपको नहीं पता कि शैल कैसे काम करता है, तो हैश-बैंग को बिल्कुल न रखें और जेनकिन्स को यह तय करने दें कि स्क्रिप्ट कैसे चलनी चाहिए।

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

#!/bin/bash -e 

यह अपनी स्क्रिप्ट बताता है कि स्क्रिप्ट में आदेशों में से किसी एक त्रुटि लौट विफल:

+1

आप वास्तव में सही थे, मैंने पहली पंक्ति के रूप में "#!/Bin/bash" किया है :) –

+1

यदि आप '#!/Bin/bash -x' जोड़ते हैं तो आप वह हिस्सा प्राप्त कर सकते हैं जहां जेनकिंस कमांड दिखाता है स्क्रिप्ट आउटपुट में चल रहा है। असल में यह सिर्फ '-e' है जिसे आप जेनकींस के डिफ़ॉल्ट' -xe' से नहीं चाहते हैं – ZombieDev

5

जेनकींस केवल पिछले आदेश रन का परिणाम कोड देख सकते हैं तो यह जानते हुए भी क्या rake test:units का परिणाम है का कोई रास्ता नहीं है।

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

+0

मुझे लगता है कि पता नहीं था, यह अब काम करता है, THX! –

+0

यह उत्तर 100% सही है, लेकिन मुझे नहीं लगता कि लोगों को लगता है कि एक अलग निर्माण चरण के रूप में हर कमांड जेनकिंस में सबसे अच्छा अभ्यास है। नीचे मेरा जवाब देखें। – sti

+0

नौकरी के प्रत्येक ब्रेकएबल हिस्से के लिए उप-चरण रखना इतना बुरा विचार नहीं है, जब तक कि यह स्पष्ट हो कि प्रत्येक उप-चरण स्वतंत्र रूप से चलाया जाता है। एक और विकल्प निर्माण में प्रत्येक उप-चरण के परिणाम की जांच करना और त्रुटि के साथ बाहर निकलना है, यदि आवश्यक हो। – Gonen

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