2009-08-20 24 views
42

सीआई बिल्ड सर्वर पर, स्थानीय मैवेन रिपोजिटरी फ़ाइल सिस्टम को दोबारा भरती है (कुछ दिनों के बाद)। ऐसे मामले में स्थानीय भंडार को ट्रिम करने के लिए अन्य क्या रणनीतियां कर रही हैं? अधिकतमनिर्माण मशीन पर मेवेन स्थानीय भंडार को मिटा देना

उत्तर

0

कितना बड़ा फाइल सिस्टम है? हमारे पास हर रात 30 दिनों से पुराने स्नैपशॉट बनाने और ज़ैप करने के लिए आवंटित 10 जीबी है। ऐसा लगता है कि

क्या आप हर एक्स घंटे या कोड बदलते समय क्या कर रहे हैं? कोड परिवर्तनों पर स्विच करने से कवरेज को कम किए बिना कलाकृतियों की संख्या कम हो जाएगी।

क्या आप स्थानीय रूप से सभी स्नैपशॉट इंस्टॉल कर रहे हैं? आपको सभी मामलों में ऐसा करने की ज़रूरत नहीं है। ज्यादातर मामलों में, केवल उन स्नैपशॉट्स जो सक्रिय रूप से विकसित निर्भरता हैं स्थानीय रूप से स्थापित करने की आवश्यकता है।

क्या आप स्थानीय रूप से ईएआर/डब्ल्यूएआर फाइलें इंस्टॉल कर रहे हैं? आपको शायद उन्हें भी जरूरत नहीं है।

आप कितने कार्यस्थान रख रहे हैं? हम हडसन का उपयोग करते हैं और केवल अंतिम 5 बिल्ड बनाए रखते हैं।

+0

मुझे यह स्पष्ट करने दें कि मैं वास्तव में पुराने स्नैपशॉट को मिटा देने के लिए एक तंत्र की तलाश में हूं, और वास्तव में एक भव्य रणनीति के लिए नहीं। यह जानकर कि मैं ऐसा करने के लिए एक स्क्रिप्ट लिख सकता हूं, मैं पहले से ही कुछ उपलब्ध कराने की उम्मीद कर रहा था। –

27

द मेवेन निर्भरता प्लगइन में purge-local-repository लक्ष्य है जो आपको स्थानीय भंडार से किसी दिए गए प्रोजेक्ट के लिए निर्भरताओं को हटाने की अनुमति देता है, यदि यह चलाया जाता है तो प्रत्येक परियोजना पर दिन में एक बार स्नैपशॉट जमा नहीं होंगे।


वैकल्पिक रूप से एक और अधिक खराब पृथ्वी दृष्टिकोण है जिसे आप ले सकते हैं। चूंकि समस्या आम तौर पर टाइमस्टैम्प स्नैपशॉट कलाकृतियों है, इसलिए आप संसाधन संग्रह पैटर्न से मेल खाने वाली सभी फ़ाइलों को हटाने के लिए maven-antrun-plugin का उपयोग कर सकते हैं।

उदाहरण के लिए

(ध्यान दें कि यह कुछ फेरबदल की आवश्यकता हो सकती के रूप में मैं यह स्मृति से किया है):

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <configuration> 
     <tasks> 
      <delete> 
      <fileset dir="${settings.localRepository}"> 
       <include name="**/*.jar"/> 
       <exclude name="**/*.pom"/> 
       <exclude name="**/*.war"/> 
       <exclude name="**/*.ear"/> 
       <exclude name="**/*.md5"/> 
       <exclude name="**/*.sha"/> 
       <!--any other extensions?...--> 
       <!--match the timestamp pattern--> 
       <containsregexp expression="[0-9]{8}.[0-9]{6}-[0-9]+"/> 
      </fileset> 
      </delete> 
     </tasks> 
     </configuration> 
     <goals> 
     <goal>run</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 
18

आप हडसन का उपयोग कर रहे हैं, तो आप सिर्फ पूरे भंडार को नष्ट करने के लिए शेड्यूल काम सेट कर सकते हैं दिन में एक बार या ऐसा कुछ। मैं जो इस विन्यास है एक नौकरी hudson-maven-repo-clean कहा जाता है:

  • बिल्ड/निष्पादित खोल: rm -rf ~hudson/.m2/repository
  • बिल्ड ट्रिगर/समय-समय बिल्ड: 0 0 * * *
4

इसके अलावा शुद्ध-स्थानीय भंडार को (जो मुझे परमाणु विकल्प की तरह पढ़ता है, क्योंकि यह केवल excludes कॉन्फ़िगरेशन को स्पष्ट includes के विपरीत प्रदान करता है), Remove Project Artifact mojo पर एक नज़र डालें। मैं इसे अभी लागू करने के लिए देख रहा हूं, क्योंकि मेरा सटीक उपयोग मामला मेरे सीआई (और कभी-कभी वर्कस्टेशन) मशीनों पर बनाए जा रहे बड़े युद्ध और ईएआर स्नैपशॉट को साफ़ करना है।

+1

स्थानीय भंडार को पुरस्कृत करें अब समर्थन और अन्य गुणों का समर्थन करता है: http://maven.apache.org/plugins/maven-dependency-plugin/purge-local-repository-mojo.html – dannrob

3

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

... 
<profile> 
    <id>hudson</id> 
    <activation> 
    <property> 
     <name>BUILD_TAG</name> 
    </property> 
    </activation> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>build-helper-maven-plugin</artifactId> 
     <version>1.7</version> 
     <executions> 
      <execution> 
      <id>remove-old-artifacts</id> 
      <phase>package</phase> 
      <goals> 
       <goal>remove-project-artifact</goal> 
      </goals> 
      <configuration> 
       <removeAll>true</removeAll> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    ... 

हटाए गए सभी का उपयोग करके सत्य पर सेट आपके सभी काम करने के अलावा अन्य सभी स्नैपशॉट मिटा देगा। यह खतरनाक हो सकता है क्योंकि इसका अर्थ यह हो सकता है कि शाखा के लिए स्नैपशॉट भी मिटा दिए जाएंगे।

उदाहरण के लिए यदि आपके पास स्नैपशॉट 1.0.0.18-SNAPSHOT हैड और स्नैपशॉट 1.0.1.17 का प्रतिनिधित्व करता है- SNAPSHOT एक शाखा का प्रतिनिधित्व करता है, 1.0.0.18-SNAPSHOT बिल्ड के साथ इस प्लगइन को चलाकर 1.0.1.17-SNAPSHOT फ़ोल्डर मिटा देगा।

इस परिदृश्य को पाने के लिए निकालें सभी को गलत पर सेट किया जाना चाहिए।

+0

हम इसे भी कर रहे हैं, और चल रहे हैं कलाकृतियों के मुद्दे में "गायब हो जाना" जबकि डाउनस्ट्रीम नौकरियां चल रही हैं। (बी के शुरू होने के बाद: बी शुरू होता है, ए की कलाकृतियों को देखता है, खुश होता है। फिर अपस्ट्रीम शुरू होता है, इसे मिटा देता है; बी, इस बीच, एक बड़ा निर्माण होने के नाते, अभी भी चल रहा है और बुरी तरह विफल रहता है क्योंकि अचानक ए के सभी कलाकृतियों चला गया। वीएम में FileNotFoundException पार्टी) –

1

हमने थोड़ा अलग (और कुटिल) तकनीक नियुक्त की है। सभी कलाकृतियों कि "बड़े बातें" (कान, युद्ध, Tars) का निर्माण उनकी तैनाती स्थान तो जैसे ओवरराइड है

<properties> 
    <discard-me-in-bit-bucket>file://${basedir}/target/_DELETEME</discard-me-in-bit-bucket> 
</properties> 

<distributionManagement> 
    <repository> 
    <id>upload-InternalSite</id> 
    <name>SoftwareLibrary External</name> 
    <url>${discard-me-in-bit-bucket}</url> 
    <layout>legacy</layout> 
    <uniqueVersion>false</uniqueVersion> 
    </repository> 
    <snapshotRepository> 
    <id>upload-InternalSite</id> 
    <name>Repository Name</name> 
    <url>${discard-me-in-bit-bucket}</url> 
    <layout>legacy</layout> 
    <uniqueVersion>false</uniqueVersion> 
    </snapshotRepository> 
</distributionManagement> 

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

find -type d -name '*_DELETEME' -exec rm -rf '{}' ';' -prune || echo $? 

हम अभी तक एक और रणनीति नियुक्त करते हैं। हडसन/जेनकींस में हम नौकरी के लिए वर्कस्पेस में .m2 रिपोजिटरी रखने के लिए एक सेटिंग फ़ाइल प्रदान करते हैं। यह हमें नौकरी के पहले या बाद में पूरे भंडार को हटाने की अनुमति देता है। यह कार्यक्षेत्र में दिखाई देने वाली कलाकृतियों को भी बनाता है जो कुछ समस्याओं को डीबग करने में सहायता करता है।

+0

['-delete'] (http://linux.die.net/man/1/find) ध्वज भी देखें; कुछ [विकिपीडिया पर उदाहरण] (http://en.wikipedia.org/wiki/Find#Delete_files_and_directories) हैं। –

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