­

對項目版本自動控制——利用gitversion

對項目版本自動控制——利用gitversion

1 為什麼需要自動版本控制

筆者很多年以前是從事fpga晶片設計工作的,那時需要將fpga的韌體下載進fpga晶片,而某個文件夾下會放歷史的韌體,那時筆者就在編譯時將編譯時刻的時刻寫進了fpga的某個暫存器,方便測試人員跟開發人員查看區分。同時將此時刻命名在了韌體的名字上以作區分。這樣新生成的版本很好區分。那會程式碼倉庫用的是SVN。

總結起來,對某項目進行自動化版本資訊命名的好處:

  • 方便測試人員產品經理識別版本變化;
  • 方便客戶帶版本資訊回饋問題,使得開發人員更有效的定位問題;
  • 自動化生成版本資訊,對開發人員則不需要有意識地去管理版本;

2 如何使項目版本一目了然

作者比較喜歡以如下格式來命名版本
{主版本}.{子版本}.{提交倉庫時間}.{倉庫短編碼}

比如
1-H.1.2021-02-02T05-45-05.3beaf10
表示主版本為1,H項目,子版本為1,程式碼提交時間為2021-02-02T05-45-05,程式碼倉庫短編碼為3beaf10

1-N.1.2021-02-02T05-45-05.3beaf10
含義同上。

3 Dot Net Core,程式集中的版本概念及作用

本文所探討的是dot Net Core里程式集的版本。
一張表看懂dll版本號的值和設定版本號方式

Assembly Version File Version Product Version
作用 net core runtime找dll的適合看這個值 區別build出來的dll和上一個版本的差異,一般此處會新增 從產品的角度解釋這個版本,同時也是nuget版本號
確認dll的版本號 [System.Reflection.Assembly]::LoadFrom(“I:\IBMS.webapi.dll”).GetName().Version 右鍵屬性Details頁File Version 右鍵屬性Details頁Product Version
設定Attribute名稱 [assembly: AssemblyVersion(“1.0.0.0”)] [assembly: AssemblyFileVersion(“1.0.0.0”)] [assembly: AssemblyInformationalVersion(“1.0.0.0”)]

3.1 AssemblyVersion查詢方式

3.2 AssemblyFileVersion與AssemblyInformationalVersion查詢方式

3.3 三個版本號的差異

3.3.1 程式集版本,Assembly Version

這是net Core 運行時用的版本號,當有reference某個dll,會包含此dll的版本號。這個版本號就是Assembly Version。當你在你的項目中引用了指定的程式集,其版本號將會嵌入到你的項目中。在運行時,CLR通過該版本號載入指定程式集。

3.3.2 文件版本,Assembly File Version

這是在文件系統中給文件的版本號,會在Windows資源管理器中顯示。但是,在.NET Framework引用類庫時從來不會用到這個版本。原則上這個是用來區分不通build的次數,遞增。

建議:如果您在為一個應用程式構建一個很多開發者都在引用的基礎程式集,並且這個程式集更新速度非常快,比如一天一次之類的,而且這個程式集還是強命名的,那麼您每次更新完程式集後所有的開發者都需要重新更新引用。這樣做非常繁瑣並且還容易引用出錯。所以對於這種情況更好的辦法是,固定好Assembly Version,而只修改Assembly File Version,即使用後者來表示最新的版本號。在這種情況下,開發者們不需要更新引用,而僅僅只需要把新的程式集文件覆蓋到引用目錄下就可以了。在中間或最後發布的版本中,為了更有意義,可以更新Assembly Version,使Assembly File Version與Assembly Version近似。

3.3.3 產品版本,AssemblyInformationalVersion

這個主要用來表示,從一個產品的角度之間的差異,可以自己在AssemblyInfo.cs文件中添加,那就是AssemblyInformationalVersion,從名字就可以看出來,這個版本號更大的意義是版本的資訊,而不僅僅是數字的描述,比如可以設置為如下的版本資訊之類的。

AssemblyInformationalVersion與AssemblyFileVersion一樣,都是可以在Windows資源管理器中顯示的,換言之,其都是存儲在Win32版本資源中的。所以如果不設置AssemblyInformationalVersion的話,默認在文件屬性里顯示的「產品版本」就是AssemblyFileVersion,而設置了AssemblyInformationalVersion以後,才會顯示AssemblyInformationalVersion設置的內容。如下圖,左邊為未設置AssemblyInformationalVersion,右邊為設置了AssemblyInformationalVersion。

如果用nuget建立出nuget的package,那麼nuget預設使用Product Version作為版本號。

3.4 Build與Revision

對於.NET的項目,版本號是由Major.Minor.Build.Revision構成的,通常被稱作主要版本、次要版本、內部版本以及修訂號。在MSDN上有專門對版本號說明的內容,比較重要的摘抄如下:

Major:名稱相同但主要版本號不同的程式集不可互換。 更高版本號可能表明大幅重寫無法假定向後兼容的產品。
Minor:如果兩個程式集的名稱和主要版本號相同,而次要版本號不同,這指示顯著增強,但照顧到了向後兼容性。 該較高的次要版本號可指示產品的修正版或完全向後兼容的新版本。
Build:生成號的不同表示對相同源所作的重新編譯。 處理器、 平台或編譯器更改時,可能使用不同的生成號。
Revision:名稱、主要版本號和次要版本號都相同但修訂號不同的程式集應是完全可互換的。 更高修訂號可能在修復以前發布的程式集安全漏洞的版本中使用。

程式集的只有Build或Revision不同的後續版本被認為是先前版本的修補程式 (Hotfix) 更新。

4 gitVersion介紹

gitVersion開源項目github地址
使用Git時的版本控制已解決。 GitVersion查看您的git歷史記錄,並計算出正在構建的提交的語義版本。

GetVersion兼容windows,linux,Mac。

官方文檔介紹

這個官方文檔雖然寫得很詳細,但是晦澀難懂,吐槽下。

5 如何在dot Net Core, visual studio項目里使用

關鍵講下如何利用gitversion工具設定項目dll的版本,這主要是指product version。因為這個資訊支援字元串寫入,包含得更全面。

5.1 下載getversion命令行工具

通過此鏈接下載Win64編譯好版本
如下圖:

5.2 將此exe工具放到需要運行的startup項目中


該工具主要可以從git倉庫中獲取版本的提交時間,版本號等資訊。

5.3 添加gitVersion工具的yml配置文件

在startup路徑下添加GitVersion.yml配置文件

配置文件內容如下:

next-version: 1.1
assembly-versioning-scheme: MajorMinorPatch
assembly-file-versioning-scheme: MajorMinorPatchTag
assembly-informational-format: '{Major}.{Minor}.{CommitDate}.{ShortSha}'
mode: ContinuousDelivery
increment: Inherit
continuous-delivery-fallback-tag: ci
tag-prefix: '[vV]'
major-version-bump-message: '\+semver:\s?(breaking|major)'
minor-version-bump-message: '\+semver:\s?(feature|minor)'
patch-version-bump-message: '\+semver:\s?(fix|patch)'
no-bump-message: '\+semver:\s?(none|skip)'
legacy-semver-padding: 4
build-metadata-padding: 4
commits-since-version-source-padding: 4
commit-message-incrementing: Enabled
commit-date-format: 'yyyy-MM-ddTHH:mm:ss'

ignore:
  sha: []
  commits-before: 2015-10-23T12:23:15
merge-message-formats: {}

配置介紹參照官網此篇

這裡主要介紹如下幾個參數:

  • next-version: 1.1
    表示主版本與子版本;

  • assembly-informational-format
    設置產品版本格式,'{Major}.{Minor}.{CommitDate}.{ShortSha}’表示,{主版本}.{子版本}.{提交倉庫時間}.{倉庫短編碼}

  • 提交日期格式
    commit-date-format: ‘yyyy-MM-ddTHH:mm:ss’

5.4 往VS項目添加項目的生成前事件

$(ProjectDir)gitversion-win-x64-5.6.4\GitVersion.exe /updateassemblyinfo $(ProjectDir)Properties\AssemblyInfo.cs /ensureassemblyinfo

大概含義是從git中取出版本資訊,更新到Properties文件夾的AssemblyInfo.cs文件中。
AssemblyInfo.cs文件如下:

//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by GitVersion.
//
// You can modify this code as we will not overwrite it when re-executing GitVersion
// </auto-generated>
//------------------------------------------------------------------------------

using System.Reflection;

[assembly: AssemblyFileVersion("1.1.0.127")]
[assembly: AssemblyVersion("1.1.0.0")]
[assembly: AssemblyInformationalVersion("1.1.2021-02-02T06-11-12.b311391")]

5.5 點擊重新生成解決方案

Net Core中 VS會自動去項目里找 AssemblyFileVersion,AssemblyVersion,AssemblyInformationalVersion關鍵屬性,匹配到會自動寫入到程式集中。

VS輸出窗口會輸出gitVersion工具產生的變數如下圖:

這些變數很有用是gitVersion產生輸出的,可以通過配置文件的格式將變數自動寫入到版本資訊中去。

5.6 寫入成功

5.7 asp net core中獲取產品版本號

   private string GetInformationalVersion()
   {

       return FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;
   }

5.8 時區加8小時

不知道什麼原因,git倉庫時間是對的,gitVersion取出來的時間就是少8小時,所以我自己手動給他加了8小時,再返回給前端。

    private string GMTAdd8(string productVersioName)
    {
        var versionArray = productVersioName.Split(".");
        DateTime dt = DateTime.ParseExact(versionArray[2], "yyyy-MM-ddTHH-mm-ss", System.Globalization.CultureInfo.CurrentCulture).AddHours(8);
        versionArray[2] = dt.ToString("yyyy-MM-ddTHH:mm:ss");
        productVersioName = string.Join(".", versionArray);

        return productVersioName;
    }

6 最終Web效果

CI/DI傳到gitLab上也能跑。

當然在gitlab上通過他的yml文件去調gitversion.exe可能會更方便,因為當有多個項目時可以共用同一個gitVersion工具,而且,項目生成不會依賴gitVersion。大家感興趣可自行研究。


版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接://www.cnblogs.com/JerryMouseLi/p/14366880.html