Azure Devops/Tfs 编译的时候自动修改版本号
看到阿迪王那边出品了一个基于Azure Devops自增版本号 链接 http://edi.wang/post/2019/3/1/incremental-build-number-for-net-core-via-azure-devops
恰巧我自己也有一个版本(虽然核心原理是差不多的)也分享下
(以下均基于Tfs 2018的截图,Azure Devops Server暂时还没发布,只能Tfs将就着了,虽然Azure Devops跟当前的Tfs 2018已经界面有"一些"改动不过流程是相通)
先说下我们的场景,我们使用Tfs来进行发布,所以我希望做到一个事情是Tfs里Release的版本号能跟我dll的版本号对应上,这样便于版本的对应和关联(实际上我们站点在启动的时候还会上报版本号到exceptionless,假如有机器漏发布了我们就能知道)
看下我们的最终效果,每次Tfs发布之后,都会改变我当前项目产生的dll的版本号,并且这个版本号(4位的)的其中后2位一定跟Tfs里的生成号一样,而Tfs的生成好的第三位是当前的月份和日期,第四位是当天build的次数
首先我能将版本号和发布或者说编译关联,其次我也能知道当天到底编译了几次

先说2个前置知识
①Azure Devops里预定义的变量 https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml
②通过Powershell如何读取Azure Devops里CI/CD的变量呢? 直接 $Env.变量名 (注意,他预定义变量名里有时候会有英文句号. 要将其转为下划线,如Build.BuildNumber你要读取的时候应该是 $Env.Build_BuildNumber)
再说说.Net里的文件版本号的是怎么来的,主要有Framework和Core两个体系,因为我们两种项目都有(当前还是Framework是大头)所以2个都要支持
Framework,主要是在项目的Properties文件夹里的AssemblyInfo.cs定义


Core,主要是项目里的csproj

顺带我再加上一个自己的假设,在这些配置文件夹里只有我们的版本号会是正则表达式为 .\d+.\d+.\d+.\d+(也就是x.x.x.x)的规则,我只要用正则找出他替换就行了。
等下,好像哪里不对劲。
在core的csproj里因为还管着nuget的引用,所以里面会有他引用的nuget包信息,所以此时他里面可能会有这些内容

于是在core项目里,我们是将version统一抽走到要给独立的props文件里
搞一个props文件,类似这样

然后在你的项目导入你的props

其实这样子之后,比如如我截图里的,我在里面定义了我项目使用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里然后引用
如

注意使用的时候一定要在高级里配置”工作文件夹”到你项目根目录(一般是csproj所在文件夹)
或者直接用Powershell Inline
也就是阿迪王分享的博客里的直接将powershell贴入到里面去执行的那个方法
两者效果一样
然后在Azure Devops里下其生成的版本号规则,即可完成匹配

然后在进行编译的时候你就能看到你的版本号被修改拉

Azure Devops/Tfs 编译的时候自动修改版本号的更多相关文章
- [Azure DevOps] 编译时自动修改版本号
1. 需求 在使用 Pipeline 自动化 CI/CD 流程的过程中,我还还需要自动修改程序集的版本号.这个功能 EdiWang 和LeoLaw 都写文章讲解过做法.不过我的项目基本都是 .Net ...
- 在推送提交之后阻止Azure DevOps (TFS)持续集成
在Azure DevOps服务器上配置生成定义时,可以配置连续集成(CI)生成.每次签入或提交到源代码库时都会自动运行一个CI构建.这种机制允许开发人员启动一个自动化的过程,例如编译和部署构建.这是一 ...
- Azure DevOps (TFS) 与 Office 集成
Azure DevOps Service 或者Azure DevOps Server 都支持与office工具集成,实现在office中完成工作项的导入导出和批量修改等功能.用户可以使用自己熟悉的of ...
- Azure Devops/TFS测试管理(下)
紧接着 上篇 经过上篇折腾,我们已经有了: ①手工测试的流程规范 ②测试用例的管理 对于开发出身的我,我觉得一个项目上线流程应该主要瓶颈只能是开发本身,因为我认为最复杂过程应该就是开发,而肯定不能是测 ...
- react-native android/ios 根据配置文件编译时自动修改版本号
开发react-native时大都有过这个操作,当版本迭代时候要修改app版本号时,一般都这样做 Android: 的要修改build.gradle文件的versionName ios: 打开xcod ...
- react-native android/ios 手动/自动 修改版本号
目录 一 手动操作 1.Android 2.IOS 二 自动从配置文件读取并写入相应的地方 1.package.json配置版本 2.Android: 3.IOS 添加sell代码 当版本迭代时候要修 ...
- 在Azure DevOps Server (TFS 2019) 流水线传递参数
变量概述 在Azure DevOps Server的流水线中,变量是衔接不同任务和不通代理之间的桥梁,它可以使相对松散.各自独立的任务之间相关影响并共享数据.在流水线中使用变量,可以在各任务之间相互调 ...
- Azure Data Factory(三)集成 Azure Devops 实现CI/CD
一,引言 由于上一节文章内容过长,无法分享Azure Data Factory 的持续集成,持续发布.今天将着重介绍一下在使用 Azure DevOps Pipeline 发布,自动进行持续集成,并且 ...
- 在Azure DevOps Server (TFS) 中修改团队项目名称
概述 [团队项目]: 在Azure DevOps Server (原名TFS)中,团队项目(Team Project)是一个最基本的数据组织容器,包含了一个团队或者信息系统中的所有信息,包括源代码.文 ...
随机推荐
- pyCharm安装破解
补丁破解 下载 http://idea.lanyus.com/jar/JetbrainsCrack-2.7-release-str.jar 并将 JetbrainsCrack-2.7-release- ...
- There is No Alternative~最小生成树变形
Description ICPC (Isles of Coral Park City) consist of several beautiful islands. The citizens reque ...
- 转载 Elasticsearch开发环境搭建(Eclipse\MyEclipse + Maven)
概要: 1.使用Eclipse搭建Elasticsearch详情参考下面链接 2.Java Elasticsearch 配置 3.ElasticSearch Java Api(一) -添加数据创建索引 ...
- Python库
--Python库之Pandas库-------- 自主选择学习了Python中的Pandas库,以下是本人对Pandas库的认识: Pandas库是Python最受欢迎的库之一,主要用于数据的操作. ...
- 请求转发(forward)和重定向(redirect)的区别
转发不会改变地址栏,重定向会. 转发是请求一次,重定向请求两次. 转发过程中只有一个request对象产生,重定向是两个. 转发不能转发到站外,重定向可以发送到站外. 重定向的第2个请求的请求方式是什 ...
- 关于input的一些问题解决方法分享
前言 input是我们接受来自用户的数据常用标签,在前端开发中,相信每个人都会用到这个标签,所以在开发过程中也时候也会遇到一些问题,本文的内容是我在跟input相爱相杀过程中产生的,在此记录分享一下. ...
- 强大的测试管理工具---TestTrack Pro
我的一篇老文章了,当年可能是第一篇介绍.从CSDN搬来的. 版权声明:本文为博主原创文章,未经博主允许不得转载. 强大的测试管理工具---TestTrack Pro 时间:2004-03-09 简介: ...
- SSM-MyBatis-12:Mybatis中添加单个对象返回主键id列
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类 public class Book { private Integer bookID; private ...
- Backbone.js 和 Nodejs 的一些共同点搞不清楚
前端方面 我用 Backbone.js 做过前端的开发,印象里就是后端按模型对象的属性把 JSON 数据发过来,我写在模板里渲染就好了 模板加载( underscore.js ) 建立模型 渲染视图 ...
- 最近最久未使用页面淘汰算法———LRU算法(java实现)
请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. LRU算法,即Last Recently Used ---选择最后一次访问时间距离当前时间最长的一页并淘汰之--即淘汰最长时间没有使用的页 按照 ...