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

相关文章
相关标签/搜索