Azure Devops/Tfs 編譯的時候自動修改版本號

看到阿迪王那邊出品了一個基於Azure Devops自增版本號  連接 http://edi.wang/post/2019/3/1/incremental-build-number-for-net-core-via-azure-devops正則表達式

恰巧我本身也有一個版本(雖然核心原理是差很少的)也分享下shell

 

(如下均基於Tfs 2018的截圖,Azure Devops Server暫時還沒發佈,只能Tfs將就着了,雖然Azure Devops跟當前的Tfs 2018已經界面有"一些"改動不過流程是相通)express

 

先說下咱們的場景,咱們使用Tfs來進行發佈,因此我但願作到一個事情是Tfs裏Release的版本號能跟我dll的版本號對應上,這樣便於版本的對應和關聯(實際上咱們站點在啓動的時候還會上報版本號到exceptionless,假若有機器漏發佈了咱們就能知道)bash

看下咱們的最終效果,每次Tfs發佈以後,都會改變我當前項目產生的dll的版本號,而且這個版本號(4位的)的其中後2位必定跟Tfs裏的生成號同樣,而Tfs的生成好的第三位是當前的月份和日期,第四位是當天build的次數app

首先我能將版本號和發佈或者說編譯關聯,其次我也能知道當天到底編譯了幾回less

image

 

 

 

先說2個前置知識post

①Azure Devops裏預約義的變量 https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yamlui

②經過Powershell如何讀取Azure Devops裏CI/CD的變量呢? 直接 $Env.變量名  (注意,他預約義變量名裏有時候會有英文句號. 要將其轉爲下劃線,如Build.BuildNumber你要讀取的時候應該是 $Env.Build_BuildNumber)3d

 

再說說.Net裏的文件版本號的是怎麼來的,主要有Framework和Core兩個體系,由於咱們兩種項目都有(當前仍是Framework是大頭)因此2個都要支持code

Framework,主要是在項目的Properties文件夾裏的AssemblyInfo.cs定義

image

image

Core,主要是項目裏的csproj

image

 

 

順帶我再加上一個本身的假設,在這些配置文件夾裏只有咱們的版本號會是正則表達式爲 .\d+.\d+.\d+.\d+(也就是x.x.x.x)的規則,我只要用正則找出他替換就好了。

 

等下,好像哪裏不對勁。

在core的csproj裏由於還管着nuget的引用,因此裏面會有他引用的nuget包信息,因此此時他裏面可能會有這些內容

image

 

因而在core項目裏,咱們是將version統一抽走到要給獨立的props文件裏

 

搞一個props文件,相似這樣

image

而後在你的項目導入你的props

image

 

其實這樣子以後,好比如我截圖裏的,我在裏面定義了我項目使用C# 7.2,那麼我全部項目都跟着是7.2,我定義了打包帶symbol就全部都帶,統一了配置,也更好一些(我的感受)

 

而後就是上powershell(這段powershell並不是我原創,也不記得好久前哪裏找來的了,而後稍加修改後一直使用至今)

 
 
# Enable -Verbose option
[CmdletBinding()]

# Regular expression pattern to find the version in the build number 
# and then apply it to the assemblies
$VersionRegex = "(?<=\d+\.\d+\.)\d+\.\d+"


# Make sure path to source code directory is available
if (-not $Env:BUILD_SOURCESDIRECTORY)
{
    Write-Error ("BUILD_SOURCESDIRECTORY environment variable is missing.")
    exit 1
}
elseif (-not (Test-Path $Env:BUILD_SOURCESDIRECTORY))
{
    Write-Error "BUILD_SOURCESDIRECTORY does not exist: $Env:BUILD_SOURCESDIRECTORY"
    exit 1
}
Write-Verbose "BUILD_SOURCESDIRECTORY: $Env:BUILD_SOURCESDIRECTORY"

# Make sure there is a build number
if (-not $Env:BUILD_BUILDNUMBER)
{
    Write-Error ("BUILD_BUILDNUMBER environment variable is missing.")
    exit 1
}
Write-Verbose "BUILD_BUILDNUMBER: $Env:BUILD_BUILDNUMBER"

# Get and validate the version data
$VersionData = [regex]::matches($Env:BUILD_BUILDNUMBER,$VersionRegex)
switch($VersionData.Count)
{
   0        
      { 
         Write-Error "Could not find version number data in BUILD_BUILDNUMBER."
         exit 1
      }
   1 {}
   default 
      { 
         Write-Warning "Found more than instance of version data in BUILD_BUILDNUMBER." 
         Write-Warning "Will assume first instance is version."
      }
}
$NewVersion = $VersionData[0]
Write-Verbose "Version: $NewVersion"


# Apply the version to the assembly property files
$commonPropsFiles = Get-ChildItem -include common.props,AssemblyInfo.cs  -recurse
if($commonPropsFiles)
{
    Write-Verbose "Will apply $NewVersion to $($commonPropsFiles.count) files."

    foreach ($file in $commonPropsFiles) {
        $filecontent = Get-Content($file)
         attrib $file -r
		 Write-Host $NewVersion
        $filecontent -replace $VersionRegex, $NewVersion | Out-File $file
        Write-Verbose "$file.FullName - version applied"

    }
}
else
{
    Write-Warning "Found no commonPropsFiles."
}

  

 

這段powershell能夠弄成一個.ps1文件放到Azure Devops裏而後引用

image

注意使用的時候必定要在高級裏配置」工做文件夾」到你項目根目錄(通常是csproj所在文件夾)

 

或者直接用Powershell Inline

也就是阿迪王分享的博客裏的直接將powershell貼入到裏面去執行的那個方法

 

二者效果同樣

 

而後在Azure Devops裏下其生成的版本號規則,便可完成匹配

image

 

而後在進行編譯的時候你就能看到你的版本號被修改拉

image

相關文章
相關標籤/搜索