Azure devops 如果在作业进行到一半时才知道版本号,如何计算“版本修订”?

Azure devops 如果在作业进行到一半时才知道版本号,如何计算“版本修订”?,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,我有一个构建管道,它的唯一目的是获取由遗留构建过程生成的二进制文件,并将它们打包到NuGet包中。NuGet包的版本号需要与二进制文件的版本号匹配,我很想知道运行号YAML名称是否也匹配,但由于NuGet提要的唯一性规则,我还需要在每个构建的末尾添加一个修订号 如果我使用的是预先知道的版本号,我知道如何获得修订号: versionNumber: 4.0.0 revision: $[counter(variables['versionNumber'], 0)] buildVersion

我有一个构建管道,它的唯一目的是获取由遗留构建过程生成的二进制文件,并将它们打包到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)
但在本例中,我直到运行时才知道版本号,因为我是从另一个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}"
我认为这是行不通的,因为在这个上下文中不能使用计数器,只能在定义变量时使用它。但是如果我在前面的变量部分尝试这样做,版本变量的值设置不正确,因此我得到了错误的计数器。在我运行前几个任务以获取版本号之后,是否有任何方法可以动态生成此修订号

如果在作业进行到一半时才知道版本号,如何计算“版本修订”

看起来您使用的是YAML,如果是,恐怕目前还没有这样的方法在完成几个任务后动态生成修订号,以获取版本号

正如您测试的那样,无论我们将获取二进制文件的任务的版本号放在变量部分的前面还是后面,我们似乎都无法正确地动态生成此修订号。这应该是YAML目前的限制

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

创建一个经典编辑器管道,并在变量选项卡中使用默认值设置versionNumber。 将powershell脚本添加到二进制文件的版本号。 调用REST API以使用从上一个powershell任务获取的新版本更新变量选项卡中的默认值versionNumber。 有关最新点的详细步骤:

转到代理阶段并选择允许脚本访问OAuth令牌。看

授予项目集合生成服务xxx帐户“编辑生成管道”权限。选择生成管道->…->安全->编辑发布定义集以允许

在生成管道中添加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
然后,我们可以看到版本号更新为2.0.0:


希望这能有所帮助。

只是想看看提供的信息是否有用。如果您需要进一步的帮助,请告诉我们。