我现在在这方面花了相当多的时间,但似乎无法做到正确,因此需要寻求建议。
我有一个 GitHub 存储库,其中包含一系列 ZIP 文件。对于我想要在 DevOps 中执行模板的每个 Zip 文件,可能有 1 个,也可能有 10 个。对于每个文件,我想要执行相同的检查。
我编写了一个 PowerShell 任务来扫描并收集 zip 文件列表。我花了相当多的时间尝试使用 OutPut 变量和变量,但似乎您根本无法使用 Azure Pipelines 中的变量来利用数组。
steps:
- ${{ each var in variables }}:
- task: PowerShell@2
displayName: 'Checking variables ${{ var.key }}'
inputs:
targetType: Inline
script: |
Write-Host ${{ var.name }}
Write-Host ${{ var.key }}
Write-Host ${{ var.value }}
Write-Host "${{ convertToJson(var) }}"
我能够循环遍历管道中的所有现有变量,但任务变量似乎未添加到此列表中?
Write-Host "##vso[task.setvariable variable=filePath;isOutput=true]$YamlVar.FullName"
使用上面的task.setvariable我可以设置和访问一个变量,但它是一个字符串,显然要多次循环遍历模板并执行与${{each一起工作的相同步骤变量中的 var }}: 结构。
还设法编写了一个variables.yml并将其添加到一个工件中,但我似乎找不到一种方法来访问我的新工件以进行潜在的利用。
- job: B
dependsOn: A1
pool:
vmImage: windows-latest
variables:
- template: ./variables.yml
steps:
- ${{ each var in variables }}:
- task: PowerShell@2
displayName: 'Checking variables ${{ var.key }}'
inputs:
targetType: Inline
script: |
Write-Host ${{ var.name }}
Write-Host ${{ var.key }}
Write-Host ${{ var.value }}
Write-Host "${{ convertToJson(var) }}"
更新
这是迄今为止壁橱的答案,但在使用时似乎是这样的。
- ${{ each var in variables }}:
变量或参数未被处理。因此它被直接解释为 Micro $(allfiles),而不是扩展和利用。
https://stackoverflow.com/a/59451690/16318957
如果我可以知道如何将我的 .yml 工件添加到构建中,然后引用它可以工作,但看来我无法在尚未执行下载阶段的步骤中直接引用模板。
这将允许我创建一个包含硬编码参数和变量的模板文件,然后发布该文件并使用该工件来执行正确数量的步骤。
当尝试下载我的工件时,我没有收到任何文件。
更新
我已经解决了这个问题,我基本上使用 DevOps API 将对象数组传递到模板中以调用单独的管道。我运行一个 PowerShell 脚本,传入所需的变量。
- task: PowerShell@2
inputs:
filePath: './PowerShell/deployment.ps1'
arguments: '-variable "TEST" -step "TEST_DEPLOYMENT" -env "TEST" -pat "$(pat)"'
然后调整 JSON 变量并使用数组列表从 API 调用管道。您的 JSON 需要利用对象作为 JSON 文本。
$JSON = @'
{
"variables":{
"file1":{
"isSecret":false,
"value":"test11"
},
"file2":{
"isSecret":false,
"value":"test21"
}
},
"templateParameters":{
<zipfilefilenameshere>,
}
}
'@
然后使用传递对象数组的 API 触发管道。
uripipeline = "https://dev.azure.com/$($org)/$($proj)/_apis/pipelines/$($id)/runs?api-version=6.0-preview.1"
发送对象时,其结构需要类似于 JSON 文本。
示例:
"[\"file1.zip\",\"file2.zip\"]"
最佳答案
我设法通过创建一个单独的管道,然后从原始管道调用该管道并传入我的对象数组来使其工作。
我正在使用此 API 调用来使其正常工作。
https://dev.azure.com/$($org)/$($proj)/_apis/pipelines/$($id)/runs?api-version=6.0-preview.1
我在原始问题末尾更新的一些示例。
关于Azure 管道循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68138386/