如何解决Azure Pipeline - 在任务之间传递变量
全部,
我有以下 Azure DevOps 管道设置,可将密钥库机密从一个 KV 复制到另一个。如您所见,我有两项任务:1) 一项读取机密,2) 一项写入机密。我很难弄清楚如何传递“$secrets”变量(通过“echo”##vso[task.setVariable variable=sourceSecrets ]$json") 从第一个任务到第二个任务。
stages:
- stage: "Test1"
displayName: "Test1 - Copy KV"
jobs:
- deployment : "Deploy"
timeoutInMinutes: 120
variables:
sourceSecrets: ""
strategy:
runOnce:
deploy:
steps:
- task: AzureCLI@2
inputs:
azureSubscription: $(ServiceConnection1)
scriptType: 'pscore'
scriptLocation: 'inlineScript'
inlineScript: |
if ("$(mysubscription1)"){
az account set --subscription "mysubscription1"
}
$secNames = az keyvault secret list --vault-name "kvName1" -o json --query "[].name" | ConvertFrom-Json
Write-Host 'Reading secrets...'
$secrets = $secNames | % {
$secret = az keyvault secret show --name $_ --vault-name "kvName1" -o json | ConvertFrom-Json
[PSCustomObject]@{
name = $_;
value = $secret.value;
}
}
$json = $($secrets | ConvertTo-Json)
echo "##vso[task.setVariable variable=sourceSecrets]$json"
- task: AzureCLI@2
inputs:
azureSubscription: $(ServiceConnection2)
scriptType: 'pscore'
scriptLocation: 'inlineScript'
inlineScript: |
if ("$(mysubscription2)"){
az account set --subscription $(mysubscription2)
}
$secrets = "$(sourceSecrets)" | ConvertFrom-Json
$secrets.foreach{
Write-Host 'Writing secrets:'
az keyvault secret set --vault-name $(kvName2) --name $_.name --value $_.value --output none
Write-Host '---->' $_.name
}
当管道执行时,任务执行得很好。但是,第二个任务出现以下错误:
ConvertFrom-Json : Conversion from JSON failed with error: Error reading JArray from JsonReader. Path '',line 1,position 1.
At /home/vsts/work/_temp/azureclitaskscript1620360635888_inlinescript.ps1:4 char:18
+ $secrets = "[" | ConvertFrom-Json
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [ConvertFrom-Json],ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand
我做了一些检查,看起来 $(sourceSecrets) 变量只包含“[”而不是整个 json 内容。这意味着第一个任务中的 "echo "##vso[task.setVariable variable=sourceSecrets]$json" 行排除了 "[" 之后的所有内容。我可以'不知道为什么要这样做。想法?
提前致谢。
解决方法
一般pipeline变量的值只支持string类型,应该是单行字符串。如果将多行内容传递给管道变量,通常只会接收第一行作为变量的值。
就您而言,您传递给变量的值是一个包含多行内容的 JSON 对象。
为避免您面临的问题,您应该将 JSON 对象的内容转换为单行字符串,然后再将其传递给管道变量。
要将多行字符串转换为单行字符串,可以尝试以下命令行:
. . .
# escape '%','\n' and '\r'
json="${json//'%'/'%25'}"
json="${json//$'\n'/'%0A'}"
json="${json//$'\r'/'%0D'}"
echo "##vso[task.setVariable variable=sourceSecrets]$json"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。