java - जेनकिंस पर कई प्रोजेक्ट बिल्ड जॉब्स में एक आम चींटी बिल्ड स्क्रिप्ट को कैसे प्रबंधित करें?




ant jenkins continuous-integration (4)

मेरे पास विभिन्न जीआईटी रिपॉजिटरीज से आने वाले जावा प्रोजेक्ट्स का एक सेट है, जिसे मैं जेनकिंस के साथ बनाया जाना चाहता हूं

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

फिलहाल मैं मैन्युअल रूप से यह साझा करता हूं, लेकिन सामान्य भाग में होने वाले बदलावों पर यह बहुत ही कम संभावना है।

तो मेरा सवाल है: जेनकिंस सर्वर पर एकाधिक बिल्ड जॉब में साझा चींटी बिल्ड स्क्रिप्ट को प्रबंधित करने का एक अच्छा तरीका क्या है?


Answers

कुछ विचार ...

  1. चींटी स्क्रिप्ट को एक कलाकृतियों के संग्रह में संग्रहीत करें जो आपकी व्यक्तिगत परियोजनाएं किसी दूसरी निर्भरता की तरह खींच सकती हैं।
  2. पेरेंट जीआईटी प्रोजेक्ट बनाएं जिसमें बिल्ड स्क्रिप्ट शामिल है। अपने मूल प्रोजेक्ट में, प्रत्येक व्यक्तिगत उप-परियोजना को एक Git submodule के रूप में नीचे खींचें। बिल्ड स्क्रिप्ट में उप-प्रोजेक्ट संदर्भों को पैरामीटर करने के लिए आपको शायद अपनी स्क्रिप्ट में कुछ मामूली संशोधन करने की आवश्यकता होगी।

यह उत्तर जेनकींस के लिए विशिष्ट नहीं है और अन्य बिल्ड सर्वरों के लिए पोर्टेबल होना चाहिए।


@ व्हाइसस्पॉडर के रूप में एक असामान्य समस्या नहीं है कि यह जेनकींस तक सीमित नहीं है मेरी राय में यह उन मुद्दों में से एक भी है जो बड़ी विरासत एएनटी बनाता है। समय-समय पर यह तर्कसंगत भय को सामान्य तर्क को बदलने के लिए कठिन और कठिन हो जाता है जिससे वह निर्भर बनाता है।

एक अलग रिपॉजिटरी या जीआईटी पोड्यूमूल में सामान्य तर्क को ध्यान में रखना उचित सलाह है क्योंकि यह इस तर्क के संस्करण नियंत्रण को सक्षम करता है। एक अन्य विकल्प आम तर्क को एक एएनटी लिब के रूप में पैकेज करना है

<project ... xmlns:common="antlib:com.example.commonbuild">

    <taskdef uri="antlib:com.example.commonbuild">
        <classpath>
             <fileset dir="${lib.dir}" includes="commonbuild-1.0.jar"/>
        </classpath>
    </taskdef>

    ..
    ..

    <target name="build">
        <common:compileAndPackage srcDir="${src.dir}" buildDir="${build.dir}" jarFile="${build.dir}/${ant.project.name}.jar"/>
    </target>

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

अंत में मैं अपनी तीसरी पार्टी निर्भरताओं को प्रबंधित करने के लिए आईवी का उपयोग करने का एक बड़ा प्रशंसक हूं इसका मतलब है कि मैं आसानी से मेरे रिपॉजिटरी से मेरे निर्माण की जरूरत के सामान्य तर्क के संस्करण जो डाउनलोड कर सकते हैं।

कैसे एक एएनटी लिब बनाने के लिए

├── build.xml
└── src
    └── com
        └── example
            └── commonbuild
                └── antlib.xml

antlib.xml

<antlib>
    <macrodef name="compileAndPackage">
        <attribute name="srcDir"/>
        <attribute name="buildDir"/>
        <attribute name="jarFile"/>
        <sequential>
            <mkdir dir="@{buildDir}/classes"/>
            <javac srcdir="@{srcDir}" destdir="@{buildDir}/classes" includeantruntime="false"/>
            <jar destfile="@{jarFile}" basedir="@{buildDir}/classes"/>
        </sequential>
    </macrodef>
</antlib>

ध्यान दें:

  • इस उदाहरण में एक कार्य है। वास्तविकता में आपके सामान्य बिल्ड तर्क कई मैक्रोोडेफ़ प्रदान करेगा

build.xml

बस एक्सएमएल फ़ाइल जार:

<target name="build" description="Create jar">
    <jar destfile="${build.dir}/commonbuild-${version}.jar" basedir="${src.dir}"/>
</target>

मेरा निर्माण तर्क अतिरिक्त रूप से इस जार फ़ाइल को मेरी रिपॉजिटरी में प्रकाशित करेगा, ताकि अन्य बनाता है Ivy का उपयोग करके इसे नीचे खींच सकते हैं। इसका भी मतलब यह है कि आम निर्माण तर्क एक अलग और औपचारिक रिलीज प्रबंधन जीवन चक्र (एक बड़े संगठन में बहुत महत्वपूर्ण) हो सकता है


मुझे एक और विकल्प भी मिल गया है:

आम निर्माण स्क्रिप्ट में "ओवरराइड करने योग्य" भाग को "तटस्थ" तत्व के रूप में घोषित करें, उदाहरण के लिए पथ परिभाषा के लिए एक खाली पथ परिभाषित करें:

<path id="additional-classpath" />

मौजूदा एक को ओवरराइड करने के लिए तटस्थ परिभाषा के बाद वैकल्पिक रूप से एक और स्क्रिप्ट आयात करें:

<import file="compile-classpath.xml" optional="true" />

आयातित फाइल में अब आप इस परियोजना की व्यक्तिगत ज़रूरतों को पूरा करने के लिए तत्व को परिभाषित कर सकते हैं।


इससे कुछ परिदृश्य में कुछ अर्थ हो सकता है:

public void myHeavyMethod() {
  List hugeList = loadHugeListOfStuff();  // lots of memory used
  ResultX res = processHugeList(hugeList); // compute some result or summary 
  // hugeList = null;  // we are done with hugeList
    ...
  // do a lot of other things that takes a LOT of time (seconds?)
  // and which do not require hugeList
   ...
}

यहां मुझे लगता है कि hugeList = null रेखा को hugeList = null करने के लिए कुछ लाभ हो सकता है , मुझे लगता है।

लेकिन यह निश्चित रूप से विधि को फिर से लिखने के लिए और अधिक समझ में आता है (शायद दो में दोबारा प्रतिक्रिया करना, या आंतरिक दायरे को निर्दिष्ट करना)।





java ant jenkins continuous-integration