【问题标题】:Store result of Azure CLI task into release variable将 Azure CLI 任务的结果存储到发布变量中
【发布时间】:2019-09-25 07:39:08
【问题描述】:

我有一个包含多个作业的发布管道。

在第一个代理作业中,有一个 Azure CLI 任务检索 azure 上存储帐户的密钥。

它执行的命令是:

az storage account keys list --account-name "$(diagnosticsStorageAccountName)" --resource-group "$(resourceGroup)"

我想要做的是存储此命令的结果并将其用于在部署组作业下运行的任务中。

我已经查看了这些资源:

Set Output Variable in Azure CLI task on VSTS

How to modify Azure DevOps release definition variable from a release task?

我已经尝试了第一个,但我没有得到它的工作。 我没有在意第二个,因为它看起来很老套。

有什么方法可以做到这一点,这不是 hacky 吗?

【问题讨论】:

  • 为什么第一个不适合你?你有什么错误吗?如果是,请在此处分享错误信息。

标签: azure-devops


【解决方案1】:

输出值未正确存储。

当您使用以下语法时,az storage account keys list --account-name "$(diagnosticsStorageAccountName)" --resource-group "$(resourceGroup)" 的输出会分布在多行中:

echo "##vso[task.setvariable variable=testvar;]%myvar%"

所以其中一个问题是只有 JSON 数组的第一行被存储到变量中。

我通过以下方式解决了这个问题:

keys=`az storage account keys list --account-name "$(diagnosticsStorageAccountName)" --resource-group "$(resourceGroup)"`
taskvariable="##vso[task.setvariable variable=_[tempVariable];]"   
echo $taskvariable$keys

根据文档echo "##vso[task.setvariable variable=testvar output=true;]%myvar% 应该使变量可用于整个版本。不幸的是,我没有运气。

我在同一个代理作业 (Ubuntu 16.0) 下使用 Powershell 任务克服了这个问题:

$url = "$($env:SYSTEM_TEAMFOUNDATIONSERVERURI)$env:SYSTEM_TEAMPROJECTID/_apis/Release/definitions/$($env:RELEASE_DEFINITIONID)?api-version=5.1"
Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Headers @{
    Authorization = "Bearer $(System.AccessToken)"
}

#Parsing JSON string from previous task
$keys = $(@"
$(_tempVariable)
"@ | ConvertFrom-Json)

# Assignment of variable value
$pipeline.variables.[variableName].value = $keys[0].value

####****************** 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 $(System.AccessToken)"}

write-host "==========================================================" 
Write-host "The value of Variable '[variableName]' is updated to" $updatedef.variables.[variableName].value
write-host "=========================================================="

请注意,为了使这项工作正常进行,您需要做几件事。

首先您需要在代理作业上allow access to the OAuth token

除此之外,您还需要提供“项目集合构建服务”。

Click on security on the release 并单击“项目集合构建服务”用户。

Change the values 用于“编辑版本”和“管理版本”以允许并保存更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 2019-12-29
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多