.net मैं अपने सीआई मंच(हडसन) के माध्यम से सी#असेंबली संस्करण को कैसे बढ़ा सकता हूं?




msbuild continuous-integration (10)

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

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

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

/MyProject/trunk/version.properties

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

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

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

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

क्या हडसन संस्करण संख्या को एक बुरा विचार बढ़ा रहा है? ऐसा करने का एक वैकल्पिक तरीका क्या होगा?

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

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

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

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


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

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

कदम:

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

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

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


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

  // 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); 
  }

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


यह एक सरल तंत्र है। इसमें बस 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 के अलावा स्रोत नियंत्रण का उपयोग कर रहे हैं तो अपने एससीएम पर्यावरण के लिए उपयुक्त के लिए - एसवीएन विकल्प बदलें।

फार्ट डाउनलोड करें


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

यदि AssemblyInfo.cs 1.0 के साथ हार्डकोड किया गया है। *, तो वास्तविक निर्माण / संशोधन कहां संग्रहीत किया जाता है?

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

Version version = new Version(Application.ProductVersion);

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


असेंबलीफाइलवर्सन विशेषता को मुद्रित करने के लिए मैंने जो किया है, वह यहां है।

AssemblyInfo.cs से AssemblyFileVersion हटा दिया

परियोजना में Assembly FileInfo.cs नामक एक नई, खाली, फ़ाइल जोड़ें।

हडसन बिल्ड मशीन पर 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>

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

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


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

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

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

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.*")]

मेरे समाधान में बाहरी उपकरण या स्क्रिप्टिंग भाषाओं को जोड़ने की आवश्यकता नहीं है - यह आपकी बिल्ड मशीन पर काम करने की बहुत अधिक गारंटी है। मैं इस समस्या को कई हिस्सों में हल करता हूं। सबसे पहले, मैंने एक 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

एक बार ऐसा करने के बाद, मैंने विजुअल स्टूडियो के समाधान एक्सप्लोरर फलक और चयनित गुणों में निर्मित प्रोजेक्ट पर राइट-क्लिक किया, बिल्ड इवेंट्स का चयन करें, और प्री-बिल्ड इवेंट कमांड लाइन के रूप में निम्न जानकारी दर्ज की, जो स्वचालित रूप से .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 फ़ाइल जेनरेट करने के लिए मैन्युअल रूप से प्रोजेक्ट का निर्माण करता हूं। आखिरकार, मैं उस प्रोजेक्ट के लिए प्रॉपर्टी टैब के नीचे, समाधान एक्सप्लोरर फलक में खींचकर विजुअल स्टूडियो समाधान में वर्जन.cs फ़ाइल को मैन्युअल रूप से शामिल करता हूं। भविष्य में, विजुअल स्टूडियो तब जेएनकिन्स बिल्ड समय पर .cs फ़ाइल पढ़ता है और इसमें से सही बिल्ड नंबर जानकारी प्राप्त करता है।


इसलिए, हमारे पास एक ऐसे समाधान के साथ एक परियोजना है जिसमें कई परियोजनाएं हैं जिनमें विभिन्न संस्करण संख्याओं के साथ असेंबली हैं।

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

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" }

मैंने -इन्कोडिंग "यूटीएफ 8" विकल्प जोड़ा क्योंकि गिट ने .cs फ़ाइल को द्विआधारी फाइलों के रूप में इलाज करना शुरू किया, अगर मैंने नहीं किया। अनुमोदित, इससे कोई फर्क नहीं पड़ता, क्योंकि मैं वास्तव में परिणाम नहीं देता हूं; यह अभी आया जब मैं परीक्षण कर रहा था।

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


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

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

<#@ 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>

माइक्रोसॉफ्ट के आयात के बाद .CSharp.targets, मेरे पास यह है (आप वीएस इंस्टॉल करते हैं इस पर निर्भर करते हैं

<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>

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

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

मैं इसके बाद रनटाइम पर अपना संस्करण प्राप्त कर सकता हूं

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






versioning