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. java之泛型的使用

    在java中,普通的类和方法只能用具体的类型,这对代码的限制很大,代码的可重用性大大降低. 那么如何才能让同一个类和方法使用不同类型的对象呢?在接触泛型之前我们可能会想到通过类型转换的方法来实现. p ...

  2. 【报错】No converter found for return value of type: class java.util.HashMap

    ssm开发碰到的错误 @ResponseBody的作用是是将java对象转为json格式的数据 @ResponseBody注解标识该方法的返回值直接写回到HTTP响应体中去(而不会被被放置到Model ...

  3. TLS是如何保障数据传输安全(中间人攻击)

    前言 前段时间和同事讨论HTTPS的工作原理,当时对这块知识原理掌握还是靠以前看了一些博客介绍,深度不够,正好我这位同事是密码学专业毕业的,结合他密码学角度对tls加解密这阐述,让我对这块原理有了更进 ...

  4. Educational Codeforces Round 105 (Rated for Div. 2)

    A. ABC String 题目:就是用'('和')'来代替A,B,C并与之对应,问是不是存在这样的对应关系使得'('和')'正好匹配 思路:第一个和最后一个字母是确定的左括号或者是右括号,这样就还剩 ...

  5. [敏杰开发]Beta阶段测试报告

    [敏杰开发]Beta阶段测试报告 这是一篇软工课程博客 项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 作业要求 Beta阶段测试报告 我们在这个课程的目标是 测试项目 这个作业在哪个 ...

  6. Visual Lab Online —— 事后分析

    项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:事后分析 事后分析 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件使得编写简 ...

  7. 7. IDEA概述和安装

    1.1IDEA概述 IDEA全称InteliJ IDEA,是用于Java语言开发的继承环境,它是业界公认的目前用于Java程序开发的最好工具 集成环境:把代码编写,编译,执行,调试等多种功能综合到一起 ...

  8. Linux中169.254.0.0/24的路由来自哪里

    在Linux中,发现每次系统启动时,都会将(169.254.0.0/16)路由启动并将其添加到路由表中.但是并不知道这条路由具有什么功能和它到底来自于哪里? [root@master01 ~]# ro ...

  9. 使用LUKS加密你的磁盘

    计算机数据的安全,保密性在现在的生活中显得越来越重要.随着数字化的时代的来临,越来越多的数据被数字化,特别是更多有关于我们隐私的数据在不断生成,甚至还有我们需要离线保存的密钥等.而且通常我们使用磁盘, ...

  10. Windows(受控主机)上配置

    Powershell版本要求及配置 windows需要使用Powershell4.0及以上版本,入下图所示,如果不是4.0及以上的需要升级 一.升级Powershell至3.0+ 1. 下载并安装Mi ...