如果直到工作中期才知道版本号,我该如何计算“版本修订”?

时间:2019-10-17 13:56:14

标签: azure-devops azure-pipelines

我有一个构建管道,其唯一目的是获取由旧式构建过程生成的二进制文件并将其打包为NuGet软件包。 NuGet软件包的版本号需要与二进制文件的版本号匹配,我非常想知道运行号(YAML“名称”)是否也匹配,但是我还需要在版本号末尾加上修订号由于NuGet提要的唯一性规则,每个版本都可以构建。

如果我使用预先知道的版本号,我知道如何获得修订号:

  versionNumber: 4.0.0
  revision: $[counter(variables['versionNumber'], 0)]
  buildVersion: $[ format('{0}.{1}', variables.versionNumber, variables.revision) ]

  name: $(BuildDefinitionName)_$(versionNumber)-rc$(revision)

,但是在这种情况下,直到运行时我才知道versionNumber,因为我是从另一个DLL的版本信息中提取它的。因此,我已对此进行了调整以执行以下操作:

  - powershell: |
      $version =  gci -Path $env:BUILD_SOURCESDIRECTORY -Recurse -Filter my.dll | % { $_.versioninfo.ProductVersion }
      Write-Host "##vso[task.setvariable variable=version]$version"

  - powershell: ${{ format('Write-Host "##vso[task.setvariable variable=revision]{0}"', counter(variables['version'], 0) }}

  - powershell: |
      $version = "${env:VERSION}-rc${env:REVISION}"
      Write-Host "##vso[build.updatebuildnumber]${env:BUILDDEFINITIONNAME}_${version}"

我认为这是行不通的,因为您不能在此上下文中使用counter,所以只能在定义变量时使用它。但是,如果我尝试在variables部分的前面进行此操作,则version变量的值设置不正确,因此我得到了错误的计数器。有什么方法可以让我 之后动态生成的修订版本号?

1 个答案:

答案 0 :(得分:0)

  

如果直到工作中间才知道版本号,我该如何计算“版本修订”?

似乎您正在使用YAML,如果可以,恐怕目前尚无这种方法来获取经过几次任务获取版本号后动态生成的修订号。

就像您进行测试一样,无论我们将获取二进制文件的任务的版本号放在variable节的前面还是后面,我们似乎都无法正确地动态生成此修订版本号。这应该是目前针对YAML的限制。

作为解决方法,我们可以使用经典编辑器来解决此问题。请检查以下步骤:

  • 创建经典的编辑器管道,并在变量标签中将versionNumber设置为默认值。
  • 将powershell脚本添加到二进制文件的版本号。
  • 调用REST API(Definitions - Update),以使用先前Powershell任务中的新版本更新变量标签中的默认值versionNumber

详细说明最新步骤:

  1. 转到Agent Phaseselect Allow Scripts to Access OAuth Token。参见Use the OAuth token to access the REST API

  2. 授予Project Collection Build Service(xxx)帐户的编辑构建管道权限。 (选择内部版本pipeline-> ...-> Security-> Edit release definition set to Allow

  3. 在构建管道中添加PowerShell任务

poswershell脚本如下:

$url = "https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?api-version=5.0"

Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"

# Update an existing variable named TestVar to its new value 2.0.0
$pipeline.variables.versionNumber.value = "<The value you get from previous powershell task>"

####****************** update the modified object **************************
$json = @($pipeline) | ConvertTo-Json -Depth 99


$updatedef = Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}

write-host "==========================================================" 
Write-host "The value of Varialbe 'versionNumber' is updated to" $updatedef.variables.versionNumber.value

然后,我们可以看到versionNumber已更新为2.0.0

enter image description here

希望这会有所帮助。