對專案版本自動控制——利用gitversion

JerryMouseLi發表於2021-02-03

對專案版本自動控制——利用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 版權協議,轉載請附上原文出處連結和本宣告。 本文連結:https://www.cnblogs.com/JerryMouseLi/p/14366880.html

相關文章