2013-08-12 4 views
12

प्रश्न: 'एमवीएन तैनाती' निष्पादित करने के लिए सबसे अच्छा समाधान क्या है कि तैनाती हिस्सा केवल सभी यूनिट परीक्षण सफल होने के बाद ही चलाया जाता है और कोई प्रोसेसिंग चरण डुप्लिकेट नहीं किया जाता है?मैवेन मल्टी-मॉड्यूल केवल सफल यूनिट परीक्षणों के बाद भंडार में तैनात है

मुझे उम्मीद थी कि सरल जवाब था: मेवेन कमांड 'एक्स' (या ध्वज का उपयोग करें) निष्पादित करें जैसे कि डिफॉल्ट को जीवनशैली में पूर्व लक्ष्यों का आविष्कार किए बिना चलाया जा सकता है।

दुर्भाग्य से यह एक सरल उत्तर है प्रतीत नहीं होता है। मैंने नीचे दिए गए पथ पर विवरण शामिल किया है।

हम निम्नलिखित तीन आवश्यकताओं है:

  • निष्पादित Maven लक्ष्य को तैनात एक दूरस्थ भंडार करने के लिए सभी बहु मॉड्यूल कलाकृतियों को तैनात करने की।
  • केवल सभी परियोजनाओं में सभी यूनिट परीक्षण पास होने पर ही तैनात करें।
  • किसी भी प्रसंस्करण को दोहराना न करें।

हम, बस "mvn स्वच्छ तैनाती" के साथ शुरू किया लेकिन हम एक जोड़े मुद्दों पर ध्यान:

  • निर्माण सभी इकाई परीक्षण पूरा करने से पहले बंद कर देंगे :: तो हम --fail-पर- जोड़ा अंत झंडा
  • तैनाती लक्ष्य किसी भी मॉड्यूल है कि सफल रहे थे के खिलाफ अमल होगा।

इसका परिणाम "दूषित" राज्य में होता है जहां रिमोट रिपोजिटरी में केवल आंशिक तैनाती हो सकती है (यदि निर्माण में विफलताओं के बाद मॉड्यूल थे)।

  1. तैनाती :: यह एक पूरी तरह से स्वचालित प्रक्रिया के लिए बहुत भारी होने के लिए निर्धारित किया गया था करने के लिए कलाकृतियों मचान पूर्व:

    हम 3 अलग समाधान को देखा।

  2. डिफ़ॉल्ट जीवन चक्र ऐसा है कि 'mvn तैनात -pci तैनाती' किसी भी पूर्व लक्ष्यों लागू :: इस काम किया है और तेज़ था बिना चला जाएगा ओवरराइड करने के लिए एक प्रोफ़ाइल का प्रयोग करें, लेकिन स्पष्ट रूप से एक अपरंपरागत दृष्टिकोण है।
  3. बस 'एमवीएन क्लीन पैकेज' चला रहा है और फिर केवल iff सफल 'mvn deploy' निष्पादित करता है :: यह काम पर प्रतीत होता है और लक्ष्यों को लागू होने पर केवल मामूली हिट लेता है (हालांकि उनमें से कुछ पुन: प्रसंस्करण के लिए पर्याप्त स्मार्ट नहीं हैं

    : एक अपरिवर्तित कार्यक्षेत्र)

मैं पृष्ठभूमि विवरण मैं ही कोई बेहतर दृष्टिकोण या (संभावित संबंध में एक मजबूत राय) निम्नलिखित अनुरोधों में से एक बना है निर्धारित करने के लिए प्रदान की है के साथ समुदाय के लिए इस सवाल का मुद्रा

  • एक नई तैनाती लक्ष्य है कि expecta साथ अन्य सभी जीवन चक्र लक्ष्यों से अलग चलाने के लिए और अलग कर सकते हैं tion कि: सभी पूर्व चरणों पहले से ही चलाया जा रहा है और यह है कि यह करने के लिए समान रूप से तैनाती निष्पादित करेंगे "mvn तैनात"
  • प्रभावी रूप से पिछले लक्ष्यों को अक्षम हैं जो तैनाती लक्ष्य में एक ध्वज।

एक छोटे से बॉक्स से बाहर और निश्चित रूप से वर्तमान सम्मेलन के खिलाफ और अधिक:

  • एक ध्वज है कि कार्यवाही करने से पहले सभी मॉड्यूल के लिए [इकाई] परीक्षण लक्ष्य को चलाने के लिए Maven कहते थे।

नोट्स:

  • हम जेनकींस उपयोग कर रहे हैं, लेकिन इस सवाल के प्रयोजनों के लिए सीआई पर्यावरण जटिलता नहीं है।
  • मैंने 'एमवीएन तैनाती: तैनाती' लक्ष्य की कोशिश की, लेकिन इसमें कई अस्पष्ट त्रुटियां थीं।
  • मैंने आवश्यकताओं के भाग के रूप में एकीकरण परीक्षण नहीं माना है।

अद्यतन 8/20/2013

मैं आस्थगित तैनाती प्लगइन का परीक्षण किया और निर्धारित उपकरण काम किया है कि उम्मीद के रूप में, लेकिन जिस तरह से करने के लिए समय लिया।

हमारे कोड बेस के लिए:

  • mvn स्वच्छ तैनाती: 02:44 में मार डाला सभी लक्ष्यों के लिए
  • mvn साफ स्थापित 'टाल-तैनात-प्लगइन': सभी लक्ष्यों के लिए 15 मिनट में मार डाला
  • एमवीएन स्वच्छ पैकेज;
      (तैनाती सहित) सभी लक्ष्यों के लिए
    • : mvn एक कस्टम निर्माण प्रोफ़ाइल अक्षम कर देता है कि पहले लक्ष्यों को मार डाला -pci तैनाती की तैनाती 4:30
    • केवल तैनाती: 1:45
  • mvn साफ पैकेज; mvn तैनात -Dmaven.test.skip = समान कार्यस्थल निष्पादित पर सच: केवल 4:40
  • तैनाती:
      (तैनाती सहित) सभी लक्ष्यों के लिए
    • 1:54

परीक्षणों को छोड़ने के बाद साफ पैकेज स्थगित तैनाती से तेज़ी से चलता है और परीक्षण सफल होने के बाद तक तैनाती में देरी की हमारी इच्छा पूरी करता है।

तैनाती जीवन चक्र निष्पादित करता है और पिछले प्रत्येक लक्ष्य (प्रक्रिया, संकलन, परीक्षण, पैकेज इत्यादि) से बाहर निकलने के लिए एक मामूली समय हिट प्रतीत होता है। हालांकि एकमात्र विकल्प गैर-मानक निष्पादन को हैक करना है, जो केवल 10 सेकंड बचाता है।

उत्तर

27

अब एक नया उत्तर है। चूंकि मैवेन तैनाती प्लगइन के संस्करण 2.8 के बाद से यह "मूल रूप से" करने का एक तरीका है। विवरण के लिए the jira issue देखें।

मूल रूप से आप प्लगइन

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-deploy-plugin</artifactId> 
    <version>2.8</version> 
</plugin> 

के कम से कम v2.8 बल और नए पैरामीटर deployAtEnd उपयोग करने के लिए की जरूरत है। अधिक जानकारी here। यह सेटिंग आमतौर पर maven-install-plugin installAtEnd के साथ जाती है

+0

मैं एक बार पूरा कर दूंगा और एक बार पूरा जवाब अपडेट करूँगा। उत्तर के लिए धन्यवाद! – Jared

+1

एफवाईआई, उल्लिखित मुद्दा https://issues.apache.org/jira/browse/MDEPLOY-157 –

+0

को संशोधित किया गया। धन्यवाद – Hilikus

1

दो चीजें।

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

में नहीं है

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

मैं इस इस्तेमाल नहीं किया है तो मैं पुष्टि नहीं कर सकता है कि क्या यह काम करता है, मैं सिर्फ यह इस विशेष यूज-केस

+0

धन्यवाद! महान सिफारिश। मैं जेनकींस कॉन्फ़िगरेशन से दूर झुका रहा हूं क्योंकि हम पोम के भीतर सभी सेटिंग्स को रखने की कोशिश कर रहे हैं। – Jared

2

एक विकल्प के रूप के लिए नहीं है पता है, मैं भी इस http://code.google.com/p/maven-deferred-deploy-plugin/

पाया

एक मैवेन प्लगइन जो एक रिएक्टर में सभी परियोजनाओं के माध्यम से पुनरावृत्त करता है और प्रत्येक प्रोजेक्ट पर व्यक्तिगत रूप से एक तैनाती निष्पादित करता है। इंस्टॉल चरण पूर्ण होने तक आर्टिफैक्ट परिनियोजन को स्थानांतरित करके को रिएक्टर के लिए निकट-परमाणु निर्माण का उत्पादन करने के लिए उपयोग किया जा सकता है।

आप जो पूछ रहे थे उसके बारे में बहुत कुछ लगता है। मुझे अभी भी लगता है कि जब आप जेनकींस का उपयोग करते हैं तो मेरा अन्य उत्तर लागू करना आसान होता है, बस चेकबॉक्स

+1

मैं इस समाधान की जांच करूंगा। यह ठीक वैसे ही लगता है जो मैं चाहता हूं। इसे पढ़ने वाले अन्य लोगों के लिए, मैं इस प्रतिक्रिया को उत्तर के रूप में चिह्नित कर रहा हूं क्योंकि यह मेरे प्रश्न का उत्तर देता है। हालांकि आप नीचे की प्रतिक्रिया को स्क्रॉल करना और समीक्षा करना चाहते हैं, जो जेनकिंस पोस्ट बिल्ड एक्शन के उपयोग को नोट करता है। – Jared

+0

अनुवर्ती: ऐसा प्रतीत होता है कि यह प्लगइन स्थापित करने के तुरंत बाद चलाना आवश्यक है (mvn क्लीन इंस्टॉल org.apache.maven.plugins: maven-deferred-deploy-plugin: तैनाती :: सफलता), आप अलगाव में प्लगइन लक्ष्य निष्पादित नहीं कर सकते (mvn org.apache.maven.plugins: maven-deferred-deploy-plugin: तैनाती :: असफलता) – Jared

+0

यदि आप इसे इंस्टॉल चरण में संलग्न करते हैं, तो यह काम नहीं करता है? – Hilikus

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