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. MVC三层架构的功能的简要说明

    MVC 介绍 MVC: Model 模型 ​ View 视图 ​ Controller 控制器 M (Model) : 模型 功能 DAO层 : 对数据库进行操作(CRUD) Service层 : 处 ...

  2. Windows服务与会话的理解

    服务 Windows NT操作系统是基于客户/服务器模式的(C/S).将操作系统中最基本的部分放到内核中,而把操作系统的绝大多数部分都放到微内核外面的一组服务器(进程)中实现.如对进程管理的进程管理服 ...

  3. 无连接运输:UDP

    多路复用和解复用与校验和是UDP唯一能做的事,运输层的协议必须做点什么,什么都没有就不需要这一层了. 为什么要使用UDP 既然有了可靠传输的TCP,为什么还要在udp之上来构件应用呢? 有效载荷大,T ...

  4. java基础——if和Swith的应用

    顺序结构 java的基本结构就是顺序结构,除非特别说明,否则就按照一句一句的执行 它是任何一个算法都离不开的基本算法结构 选择结构 if单选择 if双选择 if多选择 嵌套的if结构 switch多选 ...

  5. 【转载】fedora22和win10之间的文件共享互访

    fedora22和win10之间的文件共享互访 钢铁侠与孔子 关注 2016.06.04 14:10* 字数 1327 阅读 2170评论 0喜欢 1 一,相关知识了解(本文执行环境为fedora22 ...

  6. 什么是CPU缓存

    一.什么是CPU缓存 1. CPU缓存的来历 众所周知,CPU是计算机的大脑,它负责执行程序的指令,而内存负责存数据, 包括程序自身的数据.在很多年前,CPU的频率与内存总线的频率在同一层面上.内存的 ...

  7. Rust 多态

    Rust 多态 分发 多态的上下文中的方法解析过程被称为分发,调用该方法称为分发化,在支持多态的主流语言中,分发可以通过以下任意一种方式进行. 静态分发 当在编译期决定要调用的方法时,它被称为静态分发 ...

  8. Linux中的防火墙

    firewalld 一.防火墙安全概述 firewalld支持命令行也支持GUI设置,相对于iptables,firewalld配置更加的方便.在底层的命令都是iptables, firewalld ...

  9. 059.Python前端Django组件cooki和session

    一 会话跟踪技术 1.1 什么是会话 会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程. 1.2 什么是会话跟踪 对同一个用户对服务器的连续的请求和接受响应的监视.(将用户与同一用户发 ...

  10. 009.kubernets的调度系统之污点和容忍

    Taints和Tolerations(污点和容忍) Taint需要与Toleration配合使用,让pod避开那些不合适的node.在node上设置一个或多个Taint后,除非pod明确声明能够容忍这 ...