जावा प्रोजेक्ट्स के लिए बिल्ड और वर्जन नंबरिंग (चींटी, सीवीएस, हडसन)


134

जावा परियोजनाओं में व्यवस्थित बिल्ड नंबरिंग और संस्करण संख्या प्रबंधन के लिए वर्तमान सर्वोत्तम अभ्यास क्या हैं? विशेष रूप से:

  • वितरित विकास परिवेश में व्यवस्थित रूप से बिल्ड नंबरों का प्रबंधन कैसे करें

  • स्रोत संख्या में संस्करण संख्या कैसे बनाए रखें / रनटाइम एप्लिकेशन के लिए उपलब्ध है

  • स्रोत रिपॉजिटरी के साथ ठीक से एकीकरण कैसे करें

  • अधिक स्वचालित रूप से संस्करण संख्या बनाम रिपॉजिटरी टैग का प्रबंधन कैसे करें

  • निरंतर निर्माण बुनियादी ढांचे के साथ कैसे एकीकृत किया जाए

काफी सारे उपकरण उपलब्ध हैं, और चींटी (निर्माण प्रणाली जिसका हम उपयोग कर रहे हैं) में एक कार्य है जो एक बिल्ड संख्या बनाए रखेगा, लेकिन यह स्पष्ट नहीं है कि CVS, svn, या इसी तरह के एकाधिक, समवर्ती डेवलपर्स के साथ इसे कैसे प्रबंधित किया जाए। ।

[संपादित करें]

कई अच्छे और सहायक आंशिक या विशिष्ट उत्तर नीचे दिखाई दिए हैं, इसलिए मैं उनमें से कुछ को संक्षेप में बताऊंगा। यह मुझे लगता है कि इस पर वास्तव में एक मजबूत "सर्वोत्तम अभ्यास" नहीं है, बल्कि अतिव्यापी विचारों का संग्रह है। नीचे, मेरे सारांश और कुछ परिणामी प्रश्न खोजें, जिन्हें लोग अनुवर्ती के रूप में उत्तर देने का प्रयास कर सकते हैं। [स्टैकओवरफ़्लो के लिए नया ... कृपया टिप्पणियां प्रदान करें यदि मैं यह गलत कर रहा हूं।]

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

  • यदि आप अपने निर्माण प्रणाली के रूप में मावेन का उपयोग कर रहे हैं, तो एससीएम से एक संस्करण संख्या का उत्पादन करने के लिए समर्थन है, साथ ही साथ स्वचालित रूप से रिलीज के उत्पादन के लिए एक रिलीज मॉड्यूल है। [हम कई कारणों से मावेन का उपयोग नहीं कर सकते, लेकिन यह उन लोगों की मदद करता है जो कर सकते हैं। [ Marcelo-morales के लिए धन्यवाद ]]

  • यदि आप अपने बिल्ड सिस्टम के रूप में चींटी का उपयोग कर रहे हैं , तो निम्न कार्य विवरण एक जावा .properties फ़ाइल बनाने में मदद कर सकता है, जो निर्माण जानकारी कैप्चर कर सकता है, जिसे बाद में कई तरीकों से आपके बिल्ड में मोड़ा जा सकता है। [हमने हडसन-व्युत्पन्न जानकारी, धन्यवाद मार्टी-लैम्ब को शामिल करने के लिए इस विचार पर विस्तार किया ]।

  • चींटी और मावेन (और हडसन और क्रूज़ नियंत्रण) बिल्ड नंबर को .properties फ़ाइल में या .txt / .html फ़ाइल में प्राप्त करने के लिए आसान साधन प्रदान करते हैं। क्या यह "सुरक्षित" है इसे जानबूझकर या गलती से छेड़छाड़ करने से रोकने के लिए पर्याप्त है? क्या बिल्ड समय में इसे "वर्जनिंग" श्रेणी में संकलित करना बेहतर है?

  • अभिकथन: बिल्ड नंबरिंग को हडसन की तरह निरंतर एकीकरण प्रणाली में परिभाषित / अधिनियमित किया जाना चाहिए । [ Marcelo-morales के लिए धन्यवाद ] हमने यह सुझाव लिया है, लेकिन यह रिलीज इंजीनियरिंग के सवाल को तोड़ देता है : रिलीज कैसे होती है? क्या एक रिलीज़ में कई बिल्डऑन हैं? क्या विमोचन से अलग रिलीज के बीच एक सार्थक संबंध है?

  • प्रश्न: बिल्ड नंबर के पीछे उद्देश्य क्या है? क्या इसका उपयोग QA के लिए किया जाता है? कैसे? क्या यह मुख्य रूप से डेवलपर्स द्वारा विकास के दौरान कई बिल्ड के बीच खंडन करने के लिए उपयोग किया जाता है, या क्यूए के लिए और अधिक यह निर्धारित करने के लिए कि एंड-यूज़र को क्या मिला? यदि लक्ष्य प्रतिलिपि प्रस्तुत करने योग्य है, तो सिद्धांत रूप में यह एक रिलीज संस्करण संख्या प्रदान करना चाहिए - यह क्यों नहीं करता है? (कृपया नीचे दिए गए अपने उत्तरों के एक हिस्से के रूप में इसका उत्तर दें, यह आपके द्वारा किए गए विकल्पों को रोशन करने में मदद करेगा / सुझाएगा ...)

  • प्रश्न: क्या मैनुअल बिल्ड में नंबर बनाने की जगह है? क्या यह इतना समस्याग्रस्त है कि हर कोई एक सीआई समाधान का उपयोग करना चाहिए?

  • सवाल: क्या बिल्ड नंबर को SCM में चेक किया जाना चाहिए? यदि लक्ष्य मज़बूती से और स्पष्ट रूप से किसी विशेष बिल्ड की पहचान कर रहा है, तो विभिन्न प्रकार के निरंतर या मैन्युअल बिल्ड सिस्टम से कैसे सामना करें जो क्रैश / पुनरारंभ / आदि हो सकते हैं ...

  • प्रश्न: क्या एक बिल्ड नंबर छोटा और मीठा होना चाहिए (यानी, मोनोटोनॉली रूप से बढ़ते हुए पूर्णांक) ताकि अभिलेखीय के लिए फ़ाइल नामों में चिपकना आसान हो, संचार में संदर्भित करने के लिए आसान, आदि ... या यह उपयोगकर्ता नाम के लंबे और पूर्ण होना चाहिए, डेटास्टैम्प, मशीन के नाम, आदि?

  • प्रश्न: कृपया विवरण प्रदान करें कि बिल्ड नंबर का असाइनमेंट आपकी बड़ी स्वचालित रिलीज़ प्रक्रिया में कैसे फिट बैठता है। हाँ, मावेन प्रेमियों, हम जानते हैं कि यह किया जाता है और किया जाता है, लेकिन हम में से सभी ने अभी तक कूल-सहायता नहीं पी है ...

मैं वास्तव में इसे पूरी तरह से उत्तर देना चाहता हूं, कम से कम हमारे cvs / ant / hudson सेटअप के ठोस उदाहरण के लिए, इसलिए कोई व्यक्ति इस प्रश्न के आधार पर पूरी रणनीति बना सकता है। मैं "उत्तर" के रूप में चिह्नित करूँगा जो कोई भी इस विशेष मामले के लिए सूप-टू-नट्स का विवरण दे सकता है (जिसमें cvs टैगिंग योजना, प्रासंगिक CI कॉन्फिग आइटम, और रिलीज़ प्रक्रिया शामिल है जो बिल्ड नंबर को रिलीज़ में तह करता है जैसे कि यह प्रोग्राम है सुलभ।) यदि आप किसी अन्य विशेष कॉन्फ़िगरेशन के लिए पूछना चाहते हैं / जवाब (कहते हैं, svn / maven / क्रूज़ नियंत्रण) मैं यहाँ से प्रश्न के लिए लिंक करूँगा। --JA

[संपादित २३ अक्टूबर ० ९] मैंने शीर्ष मत वाले उत्तर को स्वीकार कर लिया है क्योंकि मुझे लगता है कि यह एक उचित समाधान है, जबकि कई अन्य उत्तर भी अच्छे विचार हैं। अगर कोई शहीद-मेमने के साथ इनमें से कुछ को संश्लेषित करने के लिए एक दरार लेना चाहता है , तो मैं एक अलग को स्वीकार करने पर विचार करूंगा। शहीद मेमने के साथ मेरी एकमात्र चिंता यह है कि यह मज़बूती से क्रमबद्ध बिल्ड नंबर का उत्पादन नहीं करता है - यह बिल्डर के सिस्टम पर एक स्थानीय घड़ी पर निर्भर करता है जो कि असंदिग्ध बिल्ड नंबर प्रदान करता है, जो महान नहीं है।

[संपादित करें 10 जुलाई]

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

public final class AppVersion
{
   // SVN should fill this out with the latest tag when it's checked out.

   private static final String APP_SVNURL_RAW = 
     "$HeadURL: svn+ssh://user@host/svnroot/app/trunk/src/AppVersion.java $";
   private static final String APP_SVN_REVISION_RAW = "$Revision: 325 $";  

   private static final Pattern SVNBRANCH_PAT = 
     Pattern.compile("(branches|trunk|releases)\\/([\\w\\.\\-]+)\\/.*");
   private static final String APP_SVNTAIL = 
     APP_SVNURL_RAW.replaceFirst(".*\\/svnroot\\/app\\/", "");

  private static final String APP_BRANCHTAG;
  private static final String APP_BRANCHTAG_NAME;
  private static final String APP_SVNREVISION = 
    APP_SVN_REVISION_RAW.replaceAll("\\$Revision:\\s*","").replaceAll("\\s*\\$", "");


  static {
    Matcher m = SVNBRANCH_PAT.matcher(APP_SVNTAIL);
    if (!m.matches()) {
      APP_BRANCHTAG = "[Broken SVN Info]";
      APP_BRANCHTAG_NAME = "[Broken SVN Info]";
    } else {
      APP_BRANCHTAG = m.group(1);
      if (APP_BRANCHTAG.equals("trunk")) {
        // this isn't necessary in this SO example, but it 
        // is since we don't call it trunk in the real case
        APP_BRANCHTAG_NAME = "trunk";
      } else {
        APP_BRANCHTAG_NAME = m.group(2);
      }
    }
  }

  public static String tagOrBranchName()
  { return APP_BRANCHTAG_NAME; }

  /** Answers a formatter String descriptor for the app version.
   * @return version string */
  public static String longStringVersion()
  { return "app "+tagOrBranchName()+" ("+
    tagOrBranchName()+", svn revision="+svnRevision()+")"; }

  public static String shortStringVersion()
  { return tagOrBranchName(); }

  public static String svnVersion()
  { return APP_SVNURL_RAW; }

  public static String svnRevision()
  { return APP_SVNREVISION; }

  public static String svnBranchId()
  { return APP_BRANCHTAG + "/" + APP_BRANCHTAG_NAME; } 

  public static final String banner()
  {
    StringBuilder sb = new StringBuilder();
    sb.append("\n----------------------------------------------------------------");
    sb.append("\nApplication -- ");
    sb.append(longStringVersion());
    sb.append("\n----------------------------------------------------------------\n");
    return sb.toString();
  }
}

टिप्पणी छोड़ दें अगर यह एक विकी चर्चा बनने के योग्य है।


2
भविष्य के पाठकों के लिए, कृपया ध्यान दें कि आपके द्वारा सुझाए गए कोड में संशोधन संख्या फ़ाइल की है, न कि रिपॉजिटरी के वैश्विक संशोधन की। अधिक जानकारी के लिए देखें: subversion.apache.org/faq.html#version-value-in-source
maayank

2
मैं सोच रहा था कि अगर किसी को समान सरल दृष्टिकोण का उपयोग करते समय gradleऔर / या हो git?
bnjmn

जवाबों:


63

अपनी कई परियोजनाओं के लिए, मैं तोड़फोड़ संशोधन संख्या, समय, उपयोगकर्ता जो बिल्ड को चलाता है, और कुछ सिस्टम जानकारी को कैप्चर करता है, उन्हें एक .properties फ़ाइल में भर देता है जो एप्लिकेशन जार में शामिल हो जाती है, और रनटाइम पर उस जार को पढ़ें।

चींटी कोड इस तरह दिखता है:

<!-- software revision number -->
<property name="version" value="1.23"/>

<target name="buildinfo">
    <tstamp>
        <format property="builtat" pattern="MM/dd/yyyy hh:mm aa" timezone="America/New_York"/>
    </tstamp>        
    <exec executable="svnversion" outputproperty="svnversion"/>
    <exec executable="whoami" outputproperty="whoami"/>
    <exec executable="uname" outputproperty="buildsystem"><arg value="-a"/></exec>

    <propertyfile file="path/to/project.properties"
        comment="This file is automatically generated - DO NOT EDIT">        
        <entry key="buildtime" value="${builtat}"/>
        <entry key="build" value="${svnversion}"/>
        <entry key="builder" value="${whoami}"/>
        <entry key="version" value="${version}"/>
        <entry key="system" value="${buildsystem}"/>
    </propertyfile>
</target>

यह जोड़ना आसान है कि आप जो भी जानकारी जोड़ना चाहते हैं उसे शामिल करें।


12
एक क्रॉस-प्लेटफ़ॉर्म संस्करण के लिए, उपर्युक्त whoami संपत्ति के बजाय इसका उपयोग करें: <प्रविष्टि कुंजी = "बिल्डर" मान = "$ {user.name}" />
एड ब्रनिन

एक प्लेटफॉर्म आश्रित समाधान के लिए -1। किसी फ़ाइल में सभी उपलब्ध उप-प्रॉपर्टीज़ का एक अच्छा तरीका है: `<संपत्ति का नाम =" antprops.file "स्थान =" $ {build.temp.project.dir} /used_ant.properties "/> <choproperties destfile =" $ {antprops.file} "/> <! - फ़ाइल को सॉर्ट करें, केवल चींटी 1.7.0 और नए के लिए -> <concat> <Union> <sort> <tokens> <file file =" $ {antprops .file} "/> <linetokenizer शामिल है =" सच "/> </ टोकन> </ तरह> </ संघ> </ concat>`
raudi

क्या आप ऐसा करने के बाद फिर से कमिट करते हैं? या यह आपके वास्तविक संशोधन करने से पहले किया जाता है?
चार्ल्स वुड

6
गिट रिपॉजिटरी के लिए यह कैसे करें?
टेकक्रंच

46

आपका build.xml

...
<property name="version" value="1.0"/>
...
<target name="jar" depends="compile">
    <buildnumber file="build.num"/>
    <manifest file="MANIFEST.MF">
        ...
        <attribute name="Main-Class" value="MyClass"/>
        <attribute name="Implementation-Version" value="${version}.${build.number}"/>
        ...
    </manifest>
</target>
...

आपका जावा कोड

String ver = MyClass.class.getPackage().getImplementationVersion();

6
एक संपत्ति का उपयोग करने के लिए +1 जो जावा पहले से ही इस तरह की विधि के साथ समर्थन करता है।
एड ब्रैनिन

2
-1 build.xml में बिल्ड नंबर होने के लिए और एक अलग गुण फ़ाइल में नहीं
राउडी

6
  • बिल्ड नंबर हडसन की तरह एक निरंतर एकीकरण सर्वर के साथ जुड़ा होना चाहिए । विभिन्न शाखाओं / टीमों / वितरण के लिए विभिन्न नौकरियों का उपयोग करें।
  • संस्करण संख्या को अंतिम बिल्ड में रखने के लिए, मैं केवल बिल्ड सिस्टम के लिए मावेन का उपयोग करने की सलाह दूंगा । यह एक .properties फ़ाइल को अंतिम .jar / .war / .whatever-ar पर संग्रहीत करेगा META-INF/maven/<project group>/<project id>/pom.properties। .Properties फ़ाइल में संस्करण गुण होंगे।
  • चूंकि मैं मावेन की सिफारिश कर रहा हूं, इसलिए मैं आपको स्रोत रिपॉजिटरी पर रिलीज तैयार करने और संस्करणों को सिंक पर रखने के लिए रिलीज प्लगइन की जांच करने का आग्रह करूंगा ।

6

सॉफ्टवेयर:

  • SVN
  • चींटी
  • हडसन, निरंतर एकीकरण के लिए
  • svntask, एसवीएन संशोधन खोजने के लिए एक चींटी कार्य: http://code.google.com/p/svntask/

हडसन के तीन बिल्ड / जॉब हैं: कंटीन्यूअस, नाइटली और रिलीज।

एक सतत / रात के निर्माण के लिए: बिल्ड नंबर SVN संशोधन है, जिसे svntask का उपयोग करके पाया जाता है।

रिलीज बिल्ड / जॉब के लिए: बिल्ड नंबर एक रिलीज, नंबर है, जिसे चींटी फ़ाइल से चींटी द्वारा पढ़ा जाता है। संपत्तियों की फ़ाइल रनटाइम पर बिल्ड नंबर प्रदर्शित करने के लिए रिलीज़ के साथ भी वितरित की जा सकती है।

चींटी बिल्ड स्क्रिप्ट बिल्ड नंबर को जार / युद्ध फ़ाइलों की प्रकट फ़ाइल में डालती है जो बिल्ड के दौरान बनाई जाती हैं। सभी बिल्ड पर लागू होता है।

रिलीज बिल्ड के लिए पोस्ट-बिल्ड एक्शन, हडसन प्लग-इन का उपयोग करके आसानी से किया गया: बिल्ड नंबर के साथ एसवीएन टैग करें।

लाभ:

  • जार / युद्ध के एक देव संस्करण के लिए, डेवलपर जार / युद्ध से SVN संशोधन पा सकता है और SVN में संबंधित कोड देख सकता है।
  • एक रिलीज के लिए, SVN संशोधन SVN टैग के लिए एक है जो इसमें रिलीज़ नंबर है।

उम्मीद है की यह मदद करेगा।


क्या आपके पास रिलीज़ बिल्ड / जॉब है बिल्ड / रिलीज़ नंबर प्रॉपर्टीज़ की जाँच करें SVN में?
मैट बी

निरंतर बिल्ड के लिए, बिल्ड नंबर SVN संशोधन संख्या है। इसलिए, चेक इन करने के लिए कुछ भी नहीं है। रिलीज़ बिल्ड के लिए, यह चेक-इन फ़ाइल है जिसका उपयोग बिल्ड नंबर प्राप्त करने के लिए किया जाता है। आमतौर पर, रिलीज़ इंजीनियर या कोई भी इस फ़ाइल को रिलीज़ से पहले अपडेट करना चाहेगा।
रैले

4

मैं हडसन का उपयोग कर रहा हूं, हालांकि कहीं अधिक सरल परिदृश्य:

मेरी चींटी स्क्रिप्ट में एक लक्ष्य है जो दिखता है:

<target name="build-number">
    <property environment="env" />
    <echo append="false" file="${build.dir}/build-number.txt">Build: ${env.BUILD_TAG}, Id: ${env.BUILD_ID}, URL: ${env.HUDSON_URL}</echo>
</target>

जब भी मेरी नौकरी चलती है हडसन मेरे लिए ये पर्यावरण चर निर्धारित करता है।

मेरे मामले में, यह प्रोजेक्ट एक वेबप है और मैं इस build-number.txtफाइल को वेबैप के रूट फ़ोल्डर में शामिल कर रहा हूं - मुझे वास्तव में परवाह नहीं है कि इसे कौन देखता है।

जब यह किया जाता है तो हम स्रोत नियंत्रण को टैग नहीं करते हैं क्योंकि हमारे पास पहले से ही हमारे हडसन का काम है बिल्ड बिल्ड / टाइमस्टैम्प के साथ टैग करना जब निर्माण सफल होता है।

मेरा समाधान केवल विकास के लिए वृद्धिशील बिल्ड संख्या को कवर करता है, हम उस परियोजना में बहुत दूर नहीं गए हैं जहां हम अभी तक रिलीज़ संख्या को कवर कर रहे हैं।


इसके अतिरिक्त (कम से कम वर्तमान जेनकींस संस्करणों में) आप गुणों की जांच कर सकते हैं: `env.SVN_URL_1 env.SVN_REVISION_1 env.SVN_URL_2 env.SVN_REVISION_2 आदि।
raudi

3

आप http://code.google.com/p/codebistro/wiki/BuildNumber पर मिले एक जार में BuildNumber मावेन प्लगइन और चींटी कार्य पर एक नज़र रखना चाहते हैं । मैंने इसे सरल और सीधा बनाने की कोशिश की। यह एक बहुत छोटी जार फ़ाइल है जो केवल कमांड लाइन सबवर्सन स्थापित पर निर्भर करती है।


3

इस तरह मैंने इसे हल किया है:

  • स्रोतों का निर्माण निर्देशिका में कॉपी किया जाता है
  • फिर एटलस्क "वर्जनफो" को लागू किया जाता है
  • संशोधित स्रोतों को संकलित करें

यहाँ जावा फाइल को संस्करण की जानकारी संग्रहीत है:

public class Settings {

    public static final String VERSION = "$VERSION$";
    public static final String DATE = "$DATE$";

}

और यहाँ एक "संस्करण" है:

    <!-- ================================= 
     target: versioninfo              
     ================================= -->
    <target name="versioninfo"
            depends="init"
            description="gets version info from svn"
    >

        <!-- 
        get svn info from the src folder 
        -->
        <typedef resource="org/tigris/subversion/svnant/svnantlib.xml"
                 classpathref="ant.classpath"
        />
        <svnSetting id="svn.setting"
                    javahl="false"
                    svnkit="true"
                    dateformatter="dd.MM.yyyy"
        />
        <svn refid="svn.setting">
            <info target="src" />
        </svn>

        <!-- 
        if repository is a taged version use "v <tagname>"
        else "rev <revisionnumber> (SVN)" as versionnumber
         -->
        <taskdef resource="net/sf/antcontrib/antcontrib.properties"
                 classpathref="ant.classpath"
        />
        <propertyregex property="version"
                       input="${svn.info.url}"
                       regexp=".*/tags/(.*)/${ant.project.name}/src"
                       select="v \1"
                       defaultvalue="rev ${svn.info.lastRev} (SVN)"
                       override="true"
        />


        <!-- 
        replace date and version in the versionfile ()
         -->
        <replace file="build/${versionfile}">
            <replacefilter token="$DATE$" value="${svn.info.lastDate}" />
            <replacefilter token="$VERSION$" value="${version}" />
        </replace>

    </target>

2

यहाँ मेरा 2 सेंट है:

  • मेरी बिल्ड स्क्रिप्ट हर बार ऐप बनाने के दौरान एक बिल्ड नंबर (टाइमस्टैम्प के साथ!) बनाती है। इससे बहुत अधिक संख्याएँ बनती हैं, लेकिन कभी बहुत कम। यदि मेरे पास कोड में परिवर्तन है, तो बिल्ड नंबर कम से कम एक बार बदल जाएगा।

  • मैं हर रिलीज के साथ बिल्ड नंबर का संस्करण देता हूं (हालांकि इनबेटन नहीं)। जब मैं प्रोजेक्ट को अपडेट करता हूं और मुझे एक नया बिल्ड नंबर मिलता है (क्योंकि किसी और ने रिलीज किया था), मैं अपने स्थानीय संस्करण को अधिलेखित करता हूं और शुरू करता हूं। यह एक निम्न बिल्ड संख्या को जन्म दे सकता है, यही वजह है कि मैंने टाइमस्टैम्प को शामिल किया है।

  • जब कोई रिलीज़ होता है, तो बिल्ड नंबर "1547 का निर्माण" संदेश के साथ एक ही प्रतिबद्ध में अंतिम आइटम के रूप में प्रतिबद्ध होता है। उसके बाद, जब यह आधिकारिक रिलीज़ होता है, तो पूरे पेड़ को टैग किया जाता है। इस तरह, बिल्ड फ़ाइल में हमेशा सभी टैग होते हैं और टैग और बिल्ड नंबर के बीच एक सरल 1: 1 मैपिंग होती है।

[संपादित करें] मैंने अपनी परियोजनाओं के साथ एक संस्करण.html तैनात किया है और फिर, मैं एक सटीक मानचित्र एकत्र करने के लिए स्क्रैपर का उपयोग कर सकता हूं जहां क्या स्थापित किया गया है। यदि आप Tomcat या समान का उपयोग कर रहे हैं, तो web.xml के descriptionतत्व में बिल्ड नंबर और टाइमस्टैम्प डालें । याद रखें: कभी भी कुछ याद न रखें जब आपके पास एक कंप्यूटर हो सकता है।


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

@ वर्धन: क्यों? बस उस संस्करण को कहीं रख दें जहाँ HTML स्क्रैपर आपके लिए इसे एकत्र कर सकता है ...
हारून डिगुल्ला

1

हम क्रूसेकंट्रोल के माध्यम से अपना निर्माण चलाते हैं (अपने पसंदीदा बिल्ड मैनेजर को यहां डालें), और मुख्य बिल्ड और परीक्षण करें।

फिर हम चींटी और बिल्डनंबर का उपयोग करके संस्करण संख्या में वृद्धि करते हैं और इस जानकारी के साथ एक संपत्ति फ़ाइल बनाते हैं, साथ ही निर्माण और अन्य मेटाडेटा की तारीख भी।

हमारे पास इसे पढ़ने और GUI / लॉग्स आदि को उपलब्ध कराने के लिए समर्पित एक वर्ग है।

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


युक्ति: यदि आप CC और Ant के BuildNumber का उपयोग कर रहे हैं, तो आप बिल्ड लेबल के साथ CC लेबल को रखने के लिए PropertyFileLabelIncrementer का उपयोग कर सकते हैं।
जेफरी फ्रेड्रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.