使用Azure Pipeline在每次编译时自动升级版本号

Azure Pipeline是一个非常强大而且部分免费的编译和发布工具,我们可以用它来连接GitHub或者Azure DevOps上的项目进行CI和CD的实践。我们经常需要的一个功能就是在CI Build中自动升级版本号,而在Azure Pipeline中,这个功能的实现却不是那么的直接,在尝试了多种方法之后,我终于找到了一种简单而且有效的方法,于是记录一下。

为了解决这个问题,我们需要用到Azure Pipeline的变量(Variable)和计数器(Counter)。

1. 变量(Variable)和计数器(Counter)

1.1. 变量(Variable)

变量顾名思义就是变量了,更多有关变量的详情可以在这里的文档中找到,在这里我们只粗略的介绍一下:

  • 变量可以是数字(常用的比如版本号1, 2, 3),文本(比如编译类型,debug或release)
  • 变量可以由外界传递进流水线(Pipeline),也可以在yml中的variable区直接定义
    • 比如发布网站的时候需要一个密码,这个密码就可以通过变量传递进来,或者保存在一个Secret变量之中,而不用写在yml中,避免安全问题

举个简单的例子:

1
2
3
4
variables:
configuration: debug
platform: x64
major_version: 1

1.2. 计数器(Counter)

计数器是Azure Pipeline提供的一个函数,他提供两个参数,一个字符串一个起始值,作用是记录以这个特定字符串作为参数的调用次数,并将这个次数加上这个起始值返回,所以我们可以把它理解成为一个简单的针对一个Pipeline的map。需要注意的是:Counter只能在定义Variable的时候使用。

打个比方,我们可以定义一个由’abc’作为key,起始值是100的计数器:$[counter('abc', 100)]

  • 第一次调用的时候(这个pipeline第一次执行的时候),这个计数器会返回100
  • 第二次调用的时候就会返回101了,以此类推

2. 利用计数器实现版本号自增长

现在有了计数器实现版本号自增长就简单了,比如我们的版本号的格式是:<主版本号>.<副版本号>.<编译版本号>,那么我们就可以定义好主版本号和副版本号,然后通过把主副版本号做key,利用计数器来生成编译版本号,如下:

1
2
3
4
variables:
buildVersionMajor: 1
buildVersionMinor: 0
buildVersionRevision: $[counter(format('{0}.{1}', variables['buildVersionMajor'], variables['buildVersionMinor']), 0)]

现在我们已经有了版本号了,接下来我们就可以将其传递给编译环境了,我们可以使用参数,或者使用一个脚本来更新一个存储版本的特定的文件来达到版本号的更新。

拿hexo-asset-path项目举例,这里我们就自己写了一个脚本来更新一个存储了版本的特定文件————package.json:

1
2
3
4
5
6
7
- task: PowerShell@2
displayName: 'Increase version number'
inputs:
targetType: 'filePath'
filePath: '$(Build.SourcesDirectory)/Build/Update-BuildRevisionVersion.ps1'
arguments: '$(buildVersionMajor).$(buildVersionMinor).$(buildVersionRevision)'
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
原创文章,转载请标明出处:Soul Orbit
本文链接地址:使用Azure Pipeline在每次编译时自动升级版本号