मैं अपने CI प्लेटफॉर्म (हडसन) के माध्यम से C # असेंबली संस्करण को कैसे बढ़ा सकता हूं?


112

स्वयं और मेरा समूह असेंबली संस्करण संख्या में वृद्धि पर भयावह है और हम अक्सर 1.0.0.0 संस्करणों के साथ असेंबली जहाज करते हैं। जाहिर है, यह बहुत सारे सिरदर्द का कारण बनता है।

हम अपने CI प्लेटफॉर्म के माध्यम से अपनी प्रथाओं के साथ बहुत बेहतर हो रहे हैं और मैं वास्तव में इसे assemblyinfo.csफ़ाइल के भीतर मानों को बढ़ाने के लिए सेट करना चाहूंगा ताकि हमारी असेंबली के संस्करण उस असेंबली में कोड परिवर्तन के साथ ऑटो अपडेट हो जाएं।

मेरे पास पहले सेटअप था (हम हडसन को खोजने से पहले ) msbuildया तो कमांड लाइन (याद नहीं कर सकते) के माध्यम से मूल्य बढ़ाने का एक तरीका है , लेकिन हडसन के साथ, जो एसवीएन रिपॉजिटरी को अपडेट करेगा और एनोट्रेड बिल्ड को ट्रिगर करेगा। परिणामस्वरूप हडसन धीमी गति से अनंत लूप बन जाता है क्योंकि हर घंटे SVN होता है।

हडसन वेतन वृद्धि संस्करण संख्या एक बुरा विचार है? इसे करने का एक वैकल्पिक तरीका क्या होगा?

आदर्श रूप से, समाधान के लिए मेरा मानदंड एक होगा:

  • बिल्ड से assemblyinfo.csपहले बिल्ड संख्या में वृद्धि
  • केवल असेंबली में बिल्ड नंबर बढ़ाता है जो बदल गया है। यह संभव नहीं हो सकता है क्योंकि हडसन हर बार एक निर्माण के दौरान परियोजना फ़ोल्डर को मिटा देता है
  • कोड रिपॉजिटरी (वर्तमान में VisualSVN ) में परिवर्तित असेंबली को चालू करता है।
  • अगली बार जब यह बदलावों के लिए स्कैन करता है तो हडसन एक नए बिल्ड को ट्रिगर करने का कारण नहीं बनता है

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

अब तक मैंने जो कुछ भी पाया है वह सिर्फ एक लेख है जिसमें बताया गया है कि संस्करण संख्या को स्वचालित रूप से कैसे बढ़ाया जाए, कुछ भी नहीं एक सीआई प्लेटफॉर्म को ध्यान में रखता है जिसे एक अनंत लूप में देखा जा सकता है।

जवाबों:


63

एक सरल विकल्प यह है कि C # परिवेश को आपके लिए असेंबली संस्करण को वर्जन विशेषता सेट करके major.minor.*(जैसा कि असेंबली इनफो फ़ाइल टेम्प्लेट में वर्णित है) सेट करके दिया जाए ।

आप एक अधिक व्यापक समाधान की तलाश में हो सकते हैं, हालांकि।

EDIT (एक टिप्पणी में सवाल का जवाब):

से AssemblyInfo.cs:

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]

मैं इससे पहले कभी नहीं आया, क्या आप इसके बारे में थोड़ा और विस्तार कर सकते हैं। क्या यह केवल एक आईडीई के भीतर कार्य करता है या क्या यह सीआई प्लेटफॉर्म के साथ डेवलपर्स की पूरी टीम में काम करता है?
एलन राइस

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

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

वाह, मुझे लगता है कि यह काम करेगा। निश्चित नहीं है कि हमने इस तरह के एक सरल समाधान की अनदेखी कैसे की
एलन चावल

आशा है कि यह, खुशी है कि मैं मदद कर सकता है। जब आसान, तेज़ तरीका सही तरीका है, तो कुछ कठिन तरीका क्यों है? :)
ग्रेग डी

65

यहाँ मैंने क्या किया है, असेंबलीफाइल विचलन विशेषता पर मुहर लगाने के लिए।

असेंबली को हटा दिया गया

असेंबली में एक नया, खाली, फ़ाइल जोड़ें, जिसका नाम असेम्बलीफाइलइन्फो.क्स है।

हडसन बिल्ड मशीन पर MSBuild सामुदायिक कार्य टूलसेट स्थापित करें या अपनी परियोजना में एक NuGet निर्भरता के रूप में।

प्रोजेक्ट (csproj) फ़ाइल को संपादित करें, यह सिर्फ एक msbuild फ़ाइल है, और निम्नलिखित जोड़ें।

कहीं न कहीं एक <PropertyGroup>मंचन होगा। इसे बदलें ताकि यह पढ़ें

 <Major>1</Major>
 <Minor>0</Minor>
 <!--Hudson sets BUILD_NUMBER and SVN_REVISION -->
 <Build>$(BUILD_NUMBER)</Build>
 <Revision>$(SVN_REVISION)</Revision>

हडसन उन एनवी चर प्रदान करता है जो आप वहां देखते हैं जब परियोजना हडसन पर बनाई गई है (यह मानते हुए कि इसे तोड़फोड़ से निकाला गया है)।

प्रोजेक्ट फ़ाइल के निचले भाग में, जोड़ें

 <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')" />
  <Target Name="BeforeBuild" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')">
    <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)" />
    <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyFileInfo.cs" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyConfiguration="$(Configuration)" Condition="$(Revision) != '' " />
  </Target>

यह MSBuildCommunityTasks का उपयोग करता है जो असेंबली बनाने के लिए असेंबली फ़ाइल वर्जन को उत्पन्न करने के लिए असेंबली फ़ाइल वर्जन शामिल करता है। यदि आप चाहें, तो आप किसी भी / सभी संस्करण विशेषताओं के लिए ऐसा कर सकते हैं।

इसका परिणाम यह होता है, जब भी आप हडसन बिल्ड जारी करते हैं, परिणामी असेंबली को 1.0.HUDSON_BUILD_NR.SVN_REVISION उदा। 1.0.6.2632 की असेंबली फ़ाइलवेशन मिलती है, जिसका अर्थ है 6 हथ का निर्माण # हडसन में, तोड़फोड़ संशोधन 2632 से।


1
तो बस इसे अपडेट करने के लिए: यह विधि C # के लिए काम करती है। मैं कुछ समय से इसका उपयोग कर रहा हूं। लेकिन C ++ असेंबली (यानी C ++ / CLI) अभी भी एक समस्या है। जहाँ तक मैं बता सकता हूँ, असेंबलीइन्फो टास्क वैध C ++ का उत्पादन नहीं करता है। इसके अलावा, मुझे लगता है कि इस पद्धति में एक मामूली नकारात्मक पहलू है कि यह अन्य डेवलपर्स के लिए यह समझने के लिए थोड़ा अपारदर्शी है कि क्या हो रहा है। बहुत बुरा आप एक संपत्ति के रूप में सीधे MSBuild में संस्करण संख्या धक्का नहीं कर सकते ...
CJBrew

@CJBrew आप केवल एक छोटी .bat फ़ाइल बना सकते हैं जो असेंबलीइन्फो के लिए C ++ कोड का उत्पादन करती है, और उस स्लीप को msbuild को किक आउट कर देती है। मुझे यकीन नहीं है कि आपको एक संपत्ति के रूप में धकेलने से क्या मतलब है, आप निश्चित रूप से आपके द्वारा पसंद की गई किसी भी संपत्ति में संस्करण के तारों को भर सकते हैं - आपको यहां उपयोग किए जाने वाले प्रमुख / मामूली / निर्माण / संशोधन का उपयोग करने की आवश्यकता नहीं है।
nos

क्या इस मार्ग का उपयोग करके कुछ भी हासिल किया जा सकता है। विधानसभा असेंबली को बाहर निकालकर टिप्पणी की जाएगी कि क्या यह विधानसभा के लिए सेट हो सकता है?
cchamberlain

@ColeChamberlain यदि आप अपने स्वयं के पीसी पर दृश्य स्टूडियो से निर्माण करते हैं, तो हडसन से नहीं - और इसका संस्करण संख्या और किसी विशेष बिल्ड और स्रोत कोड संशोधन से कोई संबंध नहीं है।
nos

42

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

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

कदम:

  1. एक वर्ग को आप समाधान फ़ाइल में जोड़ें। * .cs फ़ाइल, मैंने min SharedAssemblyProperties.cs नाम दिया है
  2. उस नई फ़ाइल से सभी cs जानकारी निकालें
  3. असेंबली जानकारी को असेंबली इनफो फ़ाइल से काटें: [असेंबली: असेंबलीवोरशन ("1.0.0.0")] [असेंबली: असेंबली फ़ाइलविज़न ("1.0.0.0")]
  4. बयान जोड़ें "System.Reflection का उपयोग कर?" फ़ाइल के लिए और फिर अपनी नई सीएस फ़ाइल में डेटा पेस्ट करें (पूर्व साझा करें
  5. प्रोजेक्ट में एक मौजूदा आइटम जोड़ें (प्रतीक्षा करें ... फ़ाइल जोड़ने से पहले पढ़ें)
  6. फ़ाइल का चयन करें और इससे पहले कि आप जोड़ें पर क्लिक करें, ऐड बटन के बगल में ड्रॉपडाउन पर क्लिक करें और "ऐड अस लिंक" चुनें।
  7. समाधान में सभी मौजूदा और नई परियोजनाओं के लिए चरण 5 और 6 दोहराएं

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

आपके स्रोत नियंत्रण में, आप एक बैट फ़ाइल या स्क्रिप्ट फ़ाइल जोड़ते हैं, जो केवल SharedAssemblyProperties.cs फ़ाइल को बढ़ाती है और आपकी सभी परियोजनाएँ उस फ़ाइल से अपनी असेंबली जानकारी अपडेट करेंगी।


धन्यवाद, मार्क। मृत लिंक के लिए क्षमा करें, यह पता चला है कि सामुदायिक सर्वर को स्थानांतरित करना आसान नहीं है। मुझे उस विषय पर मदद की तलाश करनी चाहिए ...
sondlerd

11

हडसन को कुछ पथों और फ़ाइलों में परिवर्तनों को अनदेखा करने के लिए कॉन्फ़िगर किया जा सकता है ताकि यह एक नए निर्माण का संकेत न दे।

स्रोत कोड प्रबंधन के अंतर्गत कार्य कॉन्फ़िगरेशन पृष्ठ पर, उन्नत बटन पर क्लिक करें। में शामिल न किए गए क्षेत्र बॉक्स आप मैच बहिष्करण के लिए एक या अधिक नियमित अभिव्यक्ति दर्ज करें।

उदाहरण के लिए version.properties फ़ाइल का उपयोग करने के लिए परिवर्तनों को अनदेखा करें:

/MyProject/trunk/version.properties

यह C # के अलावा अन्य भाषाओं के लिए काम करेगा और आपको अपने संस्करण की जानकारी को तोड़फोड़ में संग्रहीत करने की अनुमति देता है।


1
हडसन भी कुछ उपयोगकर्ताओं के कमिट को अनदेखा कर सकता है या प्रतिबद्ध संदेश के आधार पर निर्माण को ट्रिगर नहीं कर सकता है। इस तरह आप हडसन से सभी कमिट्स को अनदेखा कर सकते हैं।
पीटर शुएत्ज़े जुले

9

.NET आपके लिए ऐसा करता है। अपनी असेंबलीइन्फो.फॉर्क्स फ़ाइल में, अपने असेंबली संस्करण को प्रमुख.मिनोर पर सेट करें। (उदाहरण के लिए: 1.0। *)।

जब आप अपना प्रोजेक्ट बनाते हैं तो संस्करण स्वतः उत्पन्न होता है।

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


21
<रिंग, रिंग> "हैलो, उत्पाद समर्थन मैं कैसे मदद कर सकता हूं?" <ग्राहक> "मेरे पास एक त्रुटि है" <समर्थन> "ठीक है, आप कौन सा संस्करण चला रहे हैं?" <ग्राहक> "संस्करण एक बिंदु दो संशोधन आठ पांच पांच दो तीन तीन सात चार चार सात चार छक्का तीन पांच दो नौ ..." <समर्थन> "पर पकड़, बस यह टाइप करें कि ... हम्मम ... कृपया संस्करण दोहराएं संख्या, हमें लगता है कि निर्माण और संशोधन सूचीबद्ध नहीं है ... "- GRRR!
जिम्बो

हाहा अच्छा टिप्पणी मैं उस वेतन वृद्धि प्रणाली का प्रशंसक नहीं हूं: पी
जोशुआ हेस

3
दृश्य स्टूडियो में ऑटोइन्क्रिमेंट गंभीरता से बेकार है।
कुगेल

8
@ जिम्बो: जबकि हम सभी सहमत हैं कि आपकी टिप्पणी मजाकिया थी, व्यवहार में यह कोई फर्क नहीं पड़ता। जब आप अपने VS इंस्टालेशन के बारे में बात करते हैं, तो क्या आपके पास विजुअल स्टूडियो 2008 SP1 या VS2008 9.0.30729.1 SP है? ऑटोइन्क्रिमेंट बिल्ड नंबरों का उपयोग करना एक बहुत ही सामान्य योजना है और रिलीज बिल्ड सामने आने पर प्रमुख / मामूली वर्जन नंबरों को बढ़ाकर आसानी से "फिक्स्ड" किया जा सकता है।
मर्क

उच्चतम हम एक बिल्ड संख्या के साथ चले गए हैं 678 से पहले 0 को फिर से रीसेट करने से पहले मामूली संशोधन में वृद्धि के लिए (निश्चित रूप से क्रूसीकोन्ट्रोल में, हडसन की तुलना में रीसेट करना आसान लग रहा था क्योंकि क्रूसीकोन्ट्रोल में, आप बस में गए और परियोजना में इसे 0 पर वापस कर दिया। , लेकिन हडसन में बाकी सब बेहतर है)
डीन हिलर

8

मैंने वास्तव में कभी नहीं देखा है कि 1.0। * VS2005 या VS2008 में काम का फीचर। क्या ऐसा कुछ है जो मूल्यों को बढ़ाने के लिए VS सेट करने के लिए किया जाना चाहिए?

अगर असेम्बलीइन्फो.के.एक 1.0 के साथ हार्डकोड किया गया है, तो असली बिल्ड / रिविजन कहाँ संग्रहीत हैं?

असेंबलीइन्फो में 1.0 * डालने के बाद, हम निम्नलिखित कथन का उपयोग नहीं कर सकते क्योंकि ProductVersion का अब एक अमान्य मान है - यह 1.0 का उपयोग कर रहा है। * और VS द्वारा निर्दिष्ट मान नहीं:

Version version = new Version(Application.ProductVersion);

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


10
आपको असेंबली को हटाना होगा। इसके अलावा, इसका काम हमारे लिए कमाल का है, जो स्वीकृत उत्तर है।
एलन राइस

1
हां, असेंबलीफाइलवेशन को हटाने से संस्करण को अपडेट करने की अनुमति मिलती है, और संस्करण के साथ कोई और त्रुटि नहीं होती है। अच्छा लगा। नोट: दो बिल्ड ऑपरेशंस केवल एक बार रिवीजन बढ़ाते हैं, लेकिन यदि आप रिब्यूल्ड को रिब्यूल्ड अपडेट करते हैं। जैसा कि ktrauberman ने कहा, यह build.revision = date.time की तरह दिखता है, जो बताता है कि डेटा को विधानसभा में छोड़कर कहीं भी संग्रहीत नहीं किया गया है। प्राथमिक आउटपुट प्रोजेक्ट अपडेट होने पर एक नया ProductCode जनरेट करने के लिए अब मुझे एक मानक MSI सेटअप प्राप्त करने की आवश्यकता है। सेटअप संशोधन के लिए अनुमति नहीं देते हैं, केवल निर्माण करते हैं। मैं अपडेट करने के लिए मौजूदा इंस्टॉलेशन को स्थापित करना चाहता हूं। शोध करने की आवश्यकता है।
टोनीजी

5

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

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#
var build = Environment.GetEnvironmentVariable("BUILD_NUMBER");
build = build == null ? "0" : int.Parse(build).ToString();
var revision = Environment.GetEnvironmentVariable("SVN_REVISION");
revision = revision == null ? "0" : int.Parse(revision).ToString();    
#>
using System.Reflection;
[assembly: AssemblyVersion("1.0.<#=build#>.<#=revision#>")]
[assembly: AssemblyFileVersion("1.0.<#=build#>.<#=revision#>")]

3

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

मेरा पाठ टेम्प्लेट फ़ाइल संस्करण .tt इस तरह दिखता है

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#
var build = Environment.GetEnvironmentVariable("BUILD_NUMBER");
build = build == null ? "0" : int.Parse(build).ToString();
var revision = Environment.GetEnvironmentVariable("_BuildVersion");
revision = revision == null ? "5.0.0.0" : revision;    
#>
using System.Reflection;
[assembly: AssemblyVersion("<#=revision#>")]
[assembly: AssemblyFileVersion("<#=revision#>")]

मेरे पास संपत्ति समूहों में निम्नलिखित हैं

<PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
    <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
</PropertyGroup>

Microsoft.CSharp.targets के आयात के बाद, मेरे पास यह है (जहाँ आप VS स्थापित करते हैं) पर निर्भर करता है

<Import Project="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />

अपने बिल्ड सर्वर पर मैं TFS पर अंतिम बदलाव संख्या प्राप्त करने के लिए वास्तविक निर्माण से पहले पाठ परिवर्तन को चलाने के लिए निम्न स्क्रिप्ट रखता हूं

set _Path="C:\Build_Source\foo"

pushd %_Path% 
"%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe" history . /r /noprompt /stopafter:1 /Version:W > bar
FOR /f "tokens=1" %%foo in ('findstr /R "^[0-9][0-9]*" bar') do set _BuildVersion=5.0.%BUILD_NUMBER%.%%foo
del bar
popd

echo %BUILD_NUMBER%
echo %_BuildVersion%
cd C:\Program Files (x86)\Jenkins\jobs\MyJob\workspace\MyProject
MSBuild MyProject.csproj /t:TransformAll 
...
<rest of bld script>

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

मुझे यकीन है कि आप कुछ कट्टरपंथी कर सकते हैं और टीटीएस को सीधे tt टेम्पलेट के भीतर से कॉल कर सकते हैं, हालांकि यह मेरे लिए काम करता है।

फिर मैं इस तरह रनटाइम पर अपना संस्करण प्राप्त कर सकता हूं

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
return fvi.FileVersion;

1

मेरे समाधान के लिए बाहरी उपकरणों या स्क्रिप्टिंग भाषाओं को जोड़ने की आवश्यकता नहीं है - यह आपके निर्माण मशीन पर काम करने की बहुत गारंटी है। मैं इस समस्या को कई हिस्सों में हल करता हूं। सबसे पहले, मैंने एक BUILD.BAT फ़ाइल बनाई है जो जेनकिंस BUILD_NUMBER पैरामीटर को एक पर्यावरण चर में परिवर्तित करती है। मैं जेनकिंस के लिए निम्नलिखित जानकारी दर्ज करके बिल्ड बैच फ़ाइल को चलाने के लिए जेनकिन्स के "एक्सक्यूट विंडोज बैच कमांड" फ़ंक्शन का उपयोग करता हूं:

     ./build.bat --build_id %BUILD_ID% -build_number %BUILD_NUMBER%

बिल्ड वातावरण में, मेरे पास एक build.bat फ़ाइल है जो निम्नानुसार शुरू होती है:

     rem build.bat
     set BUILD_ID=Unknown
     set BUILD_NUMBER=0
     :parse_command_line
     IF NOT "%1"=="" (
         IF "%1"=="-build_id" (
             SET BUILD_ID=%2
             SHIFT
             )
         IF "%1"=="-build_number" (
             SET BUILD_NUMBER=%2
             SHIFT
         )
         SHIFT
         GOTO :parse_command_line
     )
     REM your build continues with the environmental variables set
     MSBUILD.EXE YourProject.sln

एक बार जब मैंने ऐसा कर लिया, तो मैंने Visual Studio's Solution Explorer फलक में निर्मित होने वाली परियोजना पर राइट-क्लिक किया और प्रॉपर्टीज़ का चयन किया, बिल्ड इवेंट्स का चयन किया, और प्री-बिल्ड इवेंट कमांड लाइन के रूप में निम्नलिखित जानकारी दर्ज की, जो स्वचालित रूप से एक .cs फ़ाइल बनाती है। वर्तमान परिवेश चर सेटिंग्स के आधार पर बिल्ड नंबर की जानकारी युक्त:

     set VERSION_FILE=$(ProjectDir)\Properties\VersionInfo.cs
     if !%BUILD_NUMBER%==! goto no_buildnumber_set
     goto buildnumber_set
     :no_buildnumber_set
     set BUILD_NUMBER=0
     :buildnumber_set
     if not exist %VERSION_FILE% goto no_version_file
     del /q %VERSION_FILE%
     :no_version_file
     echo using System.Reflection; >> %VERSION_FILE%
     echo using System.Runtime.CompilerServices; >> %VERSION_FILE%
     echo using System.Runtime.InteropServices; >> %VERSION_FILE%
     echo [assembly: AssemblyVersion("0.0.%BUILD_NUMBER%.1")] >> %VERSION_FILE%
     echo [assembly: AssemblyFileVersion("0.0.%BUILD_NUMBER%.1")] >> %VERSION_FILE%

आपको अपने निर्माण के स्वाद को समायोजित करने की आवश्यकता हो सकती है। मैं मुख्य परियोजना के गुण निर्देशिका में एक प्रारंभिक Version.cs फ़ाइल उत्पन्न करने के लिए एक बार मैन्युअल रूप से परियोजना का निर्माण करता हूं। अंत में, मैं मैन्युअल रूप से उस प्रोजेक्ट के लिए गुण टैब के नीचे समाधान एक्सप्लोरर फलक में खींचकर Visual Studio समाधान में Version.cs फ़ाइल को शामिल करता हूं। भविष्य में बनाता है, विजुअल स्टूडियो तब पढ़ता है कि। जेनकिन्स में .cs फ़ाइल समय का निर्माण करती है और उसमें से सही बिल्ड संख्या की जानकारी प्राप्त करती है।


1

तो, हमारे पास एक समाधान है जिसमें कई परियोजनाएं हैं जिनमें विभिन्न संस्करण संख्याओं के साथ विधानसभाएं हैं।

उपरोक्त कई विधियों की जाँच करने के बाद, मैंने अभी एक Powershell स्क्रिप्ट चलाने के लिए एक बिल्ड स्टेप लागू किया है जो असेंबलीInfo.cs फ़ाइल पर एक खोज और प्रतिस्थापित करती है। मैं अभी भी स्रोत नियंत्रण में 1.0। * संस्करण संख्या का उपयोग करता हूं, और जेनकिन्स बस मैन्युअल रूप से msbuild रन से पहले संस्करण संख्या को अपडेट करता है।

dir **/Properties/AssemblyInfo.cs | %{ (cat $_) | %{$_ -replace '^(\s*)\[assembly: AssemblyVersion\("(.*)\.\*"\)', "`$1[assembly: AssemblyVersion(`"`$2.$build`")"} | Out-File $_ -Encoding "UTF8" }
dir **/Properties/AssemblyInfo.cs | %{ (cat $_) | %{$_ -replace '^(\s*)\[assembly: AssemblyFileVersion\("(.*)\.\*"\)', "`$1[assembly: AssemblyFileVersion(`"`$2.$build`")"} | Out-File $_ -Encoding "UTF8" }

मैंने जोड़ा "-Encoding" UTF8 "विकल्प क्योंकि git ने .cs फ़ाइल को बाइनरी फ़ाइलों के रूप में मानना ​​शुरू कर दिया था यदि मैंने नहीं किया। दी, यह कोई मायने नहीं रखता था, क्योंकि मैं वास्तव में कभी भी परिणाम नहीं देता; जैसा कि मैं परीक्षण कर रहा था, वैसे ही यह सामने आया।

हमारे CI वातावरण में पहले से ही जेनिटक बिल्ड को विशेष रूप से कमिट कमिट (धन्यवाद स्टैश प्लगइन!) के साथ जोड़ने की सुविधा है, इसलिए मुझे चिंता नहीं है कि इसके साथ जुड़े संस्करण संख्या के साथ कोई git कमिट नहीं है।


0

यह एक सरल तंत्र है। इसमें MSBuild कदम से पहले एक विंडोज बैच कमांड टास्क बिल्ड स्टेप और साधारण प्रोग्राम और FART का उपयोग शामिल है।

बैच कदम

fart --svn -r AssemblyInfo.cs "[assembly: AssemblyVersion(\"1.0.0.0\")]" "[assembly: AssemblyVersion(\"1.0.%BUILD_NUMBER%.%SVN_REVISION%\")]"
if %ERRORLEVEL%==0 exit /b 1
fart --svn -r AssemblyInfo.cs "[assembly: AssemblyFileVersion(\"1.0.0.0\")]" "[assembly: AssemblyFileVersion(\"1.0.%BUILD_NUMBER%.%SVN_REVISION%\")]"
if %ERRORLEVEL%==0 exit /b 1
exit /b 0

यदि आप svn परिवर्तन के अलावा अन्य स्रोत नियंत्रण का उपयोग कर रहे हैं - तो आपके scm वातावरण के लिए उपयुक्त विकल्प के लिए svn विकल्प।

Fart डाउनलोड करें


0

मैंने प्रत्येक सफल बिल्ड पर इंक्रीमेंट करने के लिए प्रीविलेश स्क्रिप्ट ( https://gist.github.com/bradjolicoeur/e77c508089aea6614af3 ) का उपयोग करके कुछ तरीकों का उपयोग करने का निर्णय लिया। फिर ग्लोबल में .ax में मैंने कुछ इस तरह से किया है:

  // We are using debug configuration, so increment our builds.
  if (System.Diagnostics.Debugger.IsAttached)
  {
      string version = System.Reflection.Assembly.GetExecutingAssembly()
                                                       .GetName()
                                                       .Version
                                                       .ToString();

      var psi = new ProcessStartInfo(@"svn", "commit -m \"Version: " + version + "\n \"");
      psi.WorkingDirectory = @"C:\CI\Projects\myproject";
      Process.Start(psi); 
  }

मुझे अभी भी लगता है कि पूरी प्रक्रिया अधूरी है और मैं उसी परिणाम को प्राप्त करने के अधिक कुशल तरीके पर गौर करने जा रहा हूं। मैं मुख्य रूप से एसवीएन में संस्करण को पारित करने के लिए चाहता था और फिर जेनकिन में बहुत अधिक एडिटिव टूल के बिना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.