如何从构建到发布管道获取TFS / AzureDevOps中的变量值?



我已经在我的TFS/AzureDevops Build定义中定义了一个变量(假设它是time( ,并在生成定义中使用 PowerShell 任务分配值。

喜欢

类型:内联脚本。

内联脚本:

$date=$(Get-Date -Format g);
Write-Host "##vso[task.setvariable variable=time]$date"

你可以参考这个类似的例子

现在,我想在发布定义管道中获取此值。我将此生成定义配置为发布定义的持续部署。

我的问题是

如何使用其他变量在发布定义中获取time的值?这可能吗?

这不是将变量从构建传递到发布的官方方法。实现此目的的唯一方法是将值存储在文件(json,xml,yaml,你有什么(中,并将其附加为构建工件。这样,您就可以读取发行版中的文件并再次设置变量。

Martin Hinshelwood似乎对这个问题感到非常沮丧,并将该功能变成了Azure DevOps Pipelines的扩展。

包含的任务

  • 变量保存任务- 在构建期间,您可以将变量保存到与其他构建资产一起存储的 json 文件中
  • 可变加载任务- 在发布期间,您可以加载保存的变量并访问它们。

我找到了另一种解决方案,即使没有文本文件也可以使用,只需使用 Azure REST API 获取生成参数即可。

在我的发布管道中,我首先执行此 Powershell 任务以提取任何生成管道参数:

function Get-ObjectMember {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True, ValueFromPipeline=$True)]
[PSCustomObject]$obj
)
$obj | Get-Member -MemberType NoteProperty | ForEach-Object {
$key = $_.Name
[PSCustomObject]@{Key = $key; Value = $obj."$key"}
}
}
$url = "https://dev.azure.com/$(account)/$(project)/_apis/build/builds/$(Build.BuildId)?api-version=6.0"
$build = Invoke-RestMethod -Uri $url -Headers @{
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
$params = $build.templateParameters
if ($params) {
$params | Get-ObjectMember | foreach {
Write-Host $_.Key : $_.Value
echo "##vso[task.setvariable variable=$($_.Key);]$($_.Value)"
}
}

我的构建管道包含参数:RELEASE_VERSION,在我执行上述代码后,我可以在其他发布任务中使用$(RELEASE_VERSION)

在变量组中使用变量怎么样?

我设法将变量组中变量的值设置为来自构建管道的变量,然后在发布管道中读取该变量。

为此,有必要:

  • 先前已创建变量组和变量(其名称由$(variableName)标识。假设它的值将存储在$(variableValue)中(。
  • 查找变量组 ID(存储在$(variableGroupId)中(,可以通过在 Azure DevOps 上导航到该变量组来完成此操作。然后,组 ID 将位于 URL 中。
  • 对组变量具有读写访问权限的个人访问令牌 (PAT((称为$(personalAccessToken)(

CI 管道

- powershell: |
az pipelines variable-group variable update --group-id $(variableGroupId) --name $(variableName) --value $(variableValue)
displayName: 'Store the variable in a group variable'
env: 
AZURE_DEVOPS_EXT_PAT: $(personalAccessToken)

然后,只需将变量组链接到发布管道,变量将种子设定到该管道。

最新更新