如果在工作中间之前不知道内部版本号,该如何计算“内部版本”?

问题描述 投票:0回答:1

我有一个构建管道,其唯一目的是获取由旧式构建过程生成的二进制文件并将其打包为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变量的值设置不正确,因此我得到了错误的计数器。有什么方法可以让此修订号动态生成after我已经运行了前几个任务来获取版本号?

azure-devops azure-pipelines
1个回答
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. Grant 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

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.