[Azure DevOps] 编译时自动修改版本号
1. 需求
在使用 Pipeline 自动化 CI/CD 流程的过程中,我还还需要自动修改程序集的版本号。这个功能 EdiWang 和LeoLaw 都写文章讲解过做法。不过我的项目基本都是 .Net Framework 项目,而且我的版本号规则也不一样,所以这里分享一下我的做法。
我用的规则版本号规则是 [Major].[Minor].[BuildId].0,其中:
- 进行不兼容的 API 更改时,
Major将会增加 - 以后向兼容方式添加功能时,
Minor将会增加 Buildid是一个也称为运行 ID 的内部不可变 ID, 它在整个组织中是唯一的。- 第 4 位保留不用
2. 使用变量组定义 'Major' 和 'Minor'
Major 和 Minor 只有在发布新版后才会修改,因为同一个项目有几个 Pipeline(测试用、发布用等),所以我将它们定义在变量组中。定义变量组的过程如下:
- 打开 Library 选项卡,然后点击 + Varible group。
- 输入 Variable group name,这里我就随便写了个 'My variable group'。
- 启用“Allow access to all pipelines”,允许所有 Pipeline 使用。
- 点击左下角的 + Add 按钮添加变量。如果要加密存储,可以选择每个变量行末尾的锁定图标,这样变量的 Value 会以
*******的方式显示。 - 最后点击 Save 保存。

创建变量组后,打开要使用这个变量组的 Pipeline,然后切换到 Variables 选项卡,在左边的列表中选中 Variable groups,在打开的页面中点击 Link variable group,然后在打开的变量组列表中选中刚刚创建的变量组,点击 Link,完成后这个页面显示如下。

如果要在 YAML 上进行同样的操作,只需要在 YAML 中添加这句:
variables:
- group: My variable group
3. 使用预定义的 Build.BuildId 变量
Azure Pipelines 提供了一批预定义变量,,用于在 Pipeline 的任务中共享常见信息。详细的预定义变量列表可以参考 预定义变量 - Azure Pipelines Microsoft Docs 这个文档。
要唯一地标识一个 Pipeline,可以参考 配置运行或生成号 这个文档中列出的变量,例如 $(Date:yyyyMMdd)$(Rev:.r) 输出为 20200828.1,即 220年8月28日的第一次生成。
这里我选择了 Build.BuildId 作为版本号的第三位,它是每次一运行 Pipeline 都会递增的一个整数变量,而且它在整个组织中是唯一的,很适合用来做版本号。
4. 使用扩展更新版本号
懒得考虑如何更新版本号的话,可以使用 MarketPlace 里提供的扩展来处理。我选择了 Richard Fennell’s Manifest Versioning Build Tasks Azure DevOps extension 这个扩展,安装后在添加任务的列表里输入 "Version Assemblies" 找到 Version .NET Assemblies 这个任务并点击 Add 添加这个任务。

将新添加的 Task 拖动到 Build solution 的任务之前:

然后在任务的配置表单中的 Version Number 输入框中,输入:
$(AssemblyVersion).$(Build.BuildId).0

其中 AssemblyVersion 是在变量组中定义的变量,Build.BuildId 是 AzurePipelines 预定义的变量。
上面的操作在 YAML 中相当于:
name: '1.0.0.$(Rev:r)'
steps:
- task: richardfennellBM.BM-VSTS-Versioning-Task.Version-Assemblies-Task.VersionAssemblies@2
displayName: Version the assemblies
inputs:
Path: '$(Build.SourcesDirectory)'
VersionNumber: '$(AssemblyVersion).$(Build.BuildId).0'
InjectVersion: true
FilenamePattern: 'AssemblyInfo.*'
OutputVersion: 'OutputedVersion'
5. 最后
Pipeline 运行完毕后,输出的桌面应用程序的版本信息如下,可以看到文件版本和产品版本的版本号都已经改为 4.2.127.0:

更多的信息可以参考下面给出的链接:
Incremental Build Number for .NET Core via Azure DevOps
Azure Devops_Tfs 编译的时候自动修改版本号 - LeoLaw - 博客园
[Azure DevOps] 编译时自动修改版本号的更多相关文章
- react-native android/ios 根据配置文件编译时自动修改版本号
开发react-native时大都有过这个操作,当版本迭代时候要修改app版本号时,一般都这样做 Android: 的要修改build.gradle文件的versionName ios: 打开xcod ...
- java如何在eclipse编译时自动生成代码
用eclipse写java代码,自动编译时,如何能够触发一个动作,这个动作是生成本项目的代码,并且编译完成后,自动生成的代码也编译好了, java编辑器中就可以做到对新生成的代码的自动提示? 不生成代 ...
- [UE4]工程设置:自动捕获鼠标、通过代码设置鼠标显示隐藏、输入模式、编译时自动保存
一.在4.20版本中运行游戏,在没有进行任何设置的情况下,游戏不会自动捕获鼠标,游戏不会接受输入,需要手动点一下游戏界面才行.如果要跟老版本一样运行游戏自动捕获鼠标,需要进行设置 二.也可以通过代码的 ...
- Azure Devops/Tfs 编译的时候自动修改版本号
看到阿迪王那边出品了一个基于Azure Devops自增版本号 链接 http://edi.wang/post/2019/3/1/incremental-build-number-for-net-c ...
- cocos2d-html5的jsb模式下如何在编译时自动将js编译为jsc
cocos2d-html5是一个用JS来开发游戏的框架,通过javascript Binding的方式可以将游戏编译到手机上.这对前端开发人员来说非常方便,开发效率也比使用c++开发要快的多. jsb ...
- ROS知识(16)----如何编译时自动链接同一个工作空间的其他包的头文件(包含message,srv,action自动生成的头文件)
catkin_make编译时,往往需要自动链接同一个工作空间的其他包的头文件.否则会出现类似如下的错误: /home/xx/xx_ws/srcA_package/src/db.hpp:13:26: f ...
- react-native android/ios 手动/自动 修改版本号
目录 一 手动操作 1.Android 2.IOS 二 自动从配置文件读取并写入相应的地方 1.package.json配置版本 2.Android: 3.IOS 添加sell代码 当版本迭代时候要修 ...
- VS编译时自动下载NuGet管理的库
之前一直使用NuGet来管理一些第三方的库,但是每次check in代码时候为了保证编译通过,都需要把对应的packages check in. 比较耗费时间,特别是往github上同步代码,而且这些 ...
- 解决SharePoint下载文件时自动修改扩展名的问题
今天,有人告诉了我一个有趣的问题.当用户将一个扩展名为.ai的文件(Adobe illustrator格式的文件)上载到SharePoint 2013文档库中之后,点击它下载时,下载提示栏所显示的文件 ...
随机推荐
- Day008 三种初始化及内存分析
三种初始化和内存分析 Java内存分析: 堆: 存放new的对象和数组. 可以被所有的线程共享,不会存放别的对象引用. 栈: 存放基本变量类型(会包含这个基本类型的具体数值). 引用对象的变量(会存放 ...
- 去除腾讯视频logo水印
打开F12,然后再console中输入下面代码,即可. document.querySelectorAll(".txp_waterMark_pic").forEach(functi ...
- 游戏中的2D OBB碰撞模型的碰撞算法介绍和实践
前言 上一篇博文说道,射线与场景中模型上的所有三角形求交时,会大幅度影响效率且花费比较多的时间,因此会采取使用包围盒的形式,进行一个加速求交.在此文中介绍OBB碰撞模型的碰撞算法 OBB的碰撞模型 有 ...
- [DB] Flink 读 MySQL
思路 在 Flink 中创建一张表有两种方法: 从一个文件中导入表结构(Structure)(常用于批计算)(静态) 从 DataStream 或者 DataSet 转换成 Table (动态) pa ...
- CentOS6 YUM 源失效问题解决办法
问题解决 网站好不容易找到一个 Yum 源还能用,地址:https://vault.centos.org/6.9/ 操作简单,把CentOS-Base.repo 里面的东西全部删掉,添加如下内容即可. ...
- Zabbix 监控系统部署
Zabbix 监控系统部署 实验环境 Zabbix server:RHEL8 ip:192.168.121.10 一.关闭防火墙和selinux [root@Zabbix-server ~]# sys ...
- Ansible_使用文件模块将修改文件复制到受管主机
一.描述常用文件模块 1.常用文件模块 模块名称 模块说明 blockinfile 插入.更新或删除由可自定义标记线包围的多行文本块 copy 将文件从本地或远程计算机复制到受管主机上的某个位置.类似 ...
- k8s创建资源的两种方式及DaemonSet应用(5)
一.创建方式分类 Kubernetes 支持两种方式创建资源: (1)用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=reg.yunwei.com ...
- Linux Socket编程-(转自吴秦(Tyler))
"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信 ...
- html原生js实现99乘法表
原生的js实现99乘法表实现选择下拉框颜色,改变背景颜色为选中的颜色 <!DOCTYPE html> <html> <head> <meta charset= ...