1. 需求

在使用 Pipeline 自动化 CI/CD 流程的过程中,我还还需要自动修改程序集的版本号。这个功能 EdiWang 和LeoLaw 都写文章讲解过做法。不过我的项目基本都是 .Net Framework 项目,而且我的版本号规则也不一样,所以这里分享一下我的做法。

我用的规则版本号规则是 [Major].[Minor].[BuildId].0,其中:

  • 进行不兼容的 API 更改时,Major 将会增加
  • 以后向兼容方式添加功能时,Minor 将会增加
  • Buildid 是一个也称为运行 ID 的内部不可变 ID, 它在整个组织中是唯一的。
  • 第 4 位保留不用

2. 使用变量组定义 'Major' 和 'Minor'

MajorMinor 只有在发布新版后才会修改,因为同一个项目有几个 Pipeline(测试用、发布用等),所以我将它们定义在变量组中。定义变量组的过程如下:

  1. 打开 Library 选项卡,然后点击 + Varible group
  2. 输入 Variable group name,这里我就随便写了个 'My variable group'。
  3. 启用“Allow access to all pipelines”,允许所有 Pipeline 使用。
  4. 点击左下角的 + Add 按钮添加变量。如果要加密存储,可以选择每个变量行末尾的锁定图标,这样变量的 Value 会以 ******* 的方式显示。
  5. 最后点击 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] 编译时自动修改版本号的更多相关文章

  1. react-native android/ios 根据配置文件编译时自动修改版本号

    开发react-native时大都有过这个操作,当版本迭代时候要修改app版本号时,一般都这样做 Android: 的要修改build.gradle文件的versionName ios: 打开xcod ...

  2. java如何在eclipse编译时自动生成代码

    用eclipse写java代码,自动编译时,如何能够触发一个动作,这个动作是生成本项目的代码,并且编译完成后,自动生成的代码也编译好了, java编辑器中就可以做到对新生成的代码的自动提示? 不生成代 ...

  3. [UE4]工程设置:自动捕获鼠标、通过代码设置鼠标显示隐藏、输入模式、编译时自动保存

    一.在4.20版本中运行游戏,在没有进行任何设置的情况下,游戏不会自动捕获鼠标,游戏不会接受输入,需要手动点一下游戏界面才行.如果要跟老版本一样运行游戏自动捕获鼠标,需要进行设置 二.也可以通过代码的 ...

  4. Azure Devops/Tfs 编译的时候自动修改版本号

    看到阿迪王那边出品了一个基于Azure Devops自增版本号  链接 http://edi.wang/post/2019/3/1/incremental-build-number-for-net-c ...

  5. cocos2d-html5的jsb模式下如何在编译时自动将js编译为jsc

    cocos2d-html5是一个用JS来开发游戏的框架,通过javascript Binding的方式可以将游戏编译到手机上.这对前端开发人员来说非常方便,开发效率也比使用c++开发要快的多. jsb ...

  6. ROS知识(16)----如何编译时自动链接同一个工作空间的其他包的头文件(包含message,srv,action自动生成的头文件)

    catkin_make编译时,往往需要自动链接同一个工作空间的其他包的头文件.否则会出现类似如下的错误: /home/xx/xx_ws/srcA_package/src/db.hpp:13:26: f ...

  7. react-native android/ios 手动/自动 修改版本号

    目录 一 手动操作 1.Android 2.IOS 二 自动从配置文件读取并写入相应的地方 1.package.json配置版本 2.Android: 3.IOS 添加sell代码 当版本迭代时候要修 ...

  8. VS编译时自动下载NuGet管理的库

    之前一直使用NuGet来管理一些第三方的库,但是每次check in代码时候为了保证编译通过,都需要把对应的packages check in. 比较耗费时间,特别是往github上同步代码,而且这些 ...

  9. 解决SharePoint下载文件时自动修改扩展名的问题

    今天,有人告诉了我一个有趣的问题.当用户将一个扩展名为.ai的文件(Adobe illustrator格式的文件)上载到SharePoint 2013文档库中之后,点击它下载时,下载提示栏所显示的文件 ...

随机推荐

  1. Day007 递归

    递归 定义 ​ A方法调A方法!就是自己调自己 作用 ​ 利用递归可以用简单的程序来解决一些复杂的问题.它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程 ...

  2. 谷歌浏览器安装Vue.js devtools

    第一步:访问谷歌商店 在之前的博客中已经谈到了这一点的实现方式 https://www.cnblogs.com/10134dz/p/13552777.html 第二步:下载Vue.js devtool ...

  3. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(6.B)- FlexSPI NOR连接方式大全(RT500)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT500的FlexSPI NOR启动的连接方式. 这个i.MXRT FlexSPI NOR启动连接方式系列文章,痞子衡 ...

  4. 多种方法实现实现全排列 + sort调用标准函数库函数的简述

    全排列:所有不同顺序的元素组组成的一个集合.这里使用使用递归实现全排列. 使用递归算算法呢,首先我们先找一下结束的条件:我们要对一组元素(这里使用数字举例)实现全排列,临界条件就是递归到只有一个元素的 ...

  5. 从0开始fastjson漏洞分析

    关于fastjson漏洞利用参考:https://www.cnblogs.com/piaomiaohongchen/p/10799466.html fastjson这个漏洞出来了很久,一直没时间分析, ...

  6. CRM应用中可能发生的问题

    CRM系统是公认的提升企业竞争力的强大工具.它既是以客户为中心的思想,又是一种企业管理方案.当然,它还是一种管理软件.在国外,CRM使企业运营得风生水起,但在我国的企业应用中,还是有着很高的失败率和使 ...

  7. [Django框架 - 注意事项,安装,项目搭建,小白必会三板斧]

    [Django框架 - 注意事项,安装,项目搭建,小白必会三板斧] 想要正常运行django项目所需要知道的注意事项 1. 计算机名称不能有中文,不然bug在哪儿你都不知道! 2. 项目名和py文件名 ...

  8. [在学习Django框架之前所需要了解的知识点]

    [在学习Django框架之前所需要了解的知识点] Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现 ...

  9. 。 (有些情况下通过 lsof(8) 或 fuser(1) 可以 找到有关使用该设备的进程的有用信息)

    umount时目标忙解决办法 标签(空格分隔): ceph ceph运维 osd 在删除osd后umount时,始终无法umonut,可以通过fuser查看设备被哪个进程占用,之后杀死进程,就可以顺利 ...

  10. S6 文件备份与压缩命令

    6.1 tar:打包备份 6.2 gzip:压缩或解压文件 6.3-4 zip.unzip 6.5 scp:远程文件复制 6.6 rsync:文件同步工具