全部,
我有下面的Azure DevOps管道设置,可以将密钥库机密从一个KV复制到另一个KV。正如你所看到的,我有两项任务:1(一项是阅读秘密,另一项是编写秘密。我很难弄清楚如何通过">$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&";来自第一个任务的行是排除"0"之后的所有内容;我不明白它为什么这么做。想法?
提前谢谢。
通常,管道变量的值只支持字符串类型,并且应该是单行字符串。如果将多行内容传递给管道变量,通常只接收第一行作为变量的值。
在您的案例中,传递给变量的值是一个包含多行内容的JSON对象。
为了避免您面临的问题,在将JSON对象的内容传递给管道变量之前,应该将其转换为单行字符串。
要将多行字符串转换为单行字符串,可以尝试以下命令行:
. . .
# escape '%', 'n' and 'r'
json="${json//'%'/'%25'}"
json="${json//$'n'/'%0A'}"
json="${json//$'r'/'%0D'}"
echo "##vso[task.setVariable variable=sourceSecrets]$json"