我目前正在开发一些 ADO 管道模板,以帮助团队构建一些类似的管道。当前的 YAML 模板如下所示:
# templates/run-script.yml
parameters:
- name: dockerImageName
- name: targetScript
- name: variableGroupName
jobs:
- job: 'Run_Script'
variables:
group: ${{ parameters.variableGroupName }}
steps:
- task: DownloadPipelineArtifact@2
inputs:
artifact: ${{ parameters.dockerImageName }}_image
path: $(System.DefaultWorkingDirectory)
- task: Bash@3
inputs:
targetType: 'inline'
script: |
echo 'Loading docker image tarball'
docker load < ${{ parameters.dockerImageName }}_image.tgz
echo 'Running script in container'
docker run -e foo=$(foo) -e bar=$(bar) -e baz=$(baz) ${{ parameters.dockerImageName }} ${{ parameters.targetScript }}
变量
foo
、bar
和 baz
是使用 variableGroupName
参数传递到模板的变量组中的变量。在这种情况下,baz
将包含一个秘密。我遇到的问题是,当我将模板与不同的变量组重用时,这些变量名称会有所不同,因此该模板实际上对于保持代码处于当前状态没有什么用处。我想做的是创建一个文件env.list
,其中包含:
foo=(value of foo)
bar=(value of bar)
baz=(value of baz)
这将允许我将模板的最后一行重写为:
docker run --env-file env.list ${{ parameters.dockerImageName }} ${{ parameters.targetScript }}
我需要某种方法将名称值从变量组中取出并放入该文件中。到目前为止,我已经尝试使用 Bash 任务来使用
az devops variable-group variable list
获取变量,但我无法找到正确解析它们的方法。实现这一目标的最佳方法是什么?或者,如果这是一个不好的方法,那么解决该问题的最佳实践解决方案是什么?
实现您正在寻找的目标的一个选择是使用 API 来检索变量组中存储的所有变量的键和值。
Powershell 脚本,用于将所有秘密值保存到名为
env.list
: 的文件中
$variableGroupId = "117"
$sourceOrganization = "org"
$sourceProject = "project"
$sourcePat = "pat"
$sourceBase64Pat = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("`:$sourcePat"))
$url = "https://dev.azure.com/$sourceOrganization/$sourceProject/_apis/distributedtask/variablegroups/$($variableGroupId)?api-version=7.1-preview.2"
$result = Invoke-RestMethod -Uri $url -Headers @{Authorization = ("Basic $sourceBase64Pat") } -Method get -ContentType "application/json"
$jsonString = ConvertTo-Json -InputObject $result.variables
$resultObject = ConvertFrom-Json -InputObject $jsonString
foreach ($property in $resultObject.PSObject.Properties) {
$key = $property.Name
$value = $property.Value.Value
Add-Content -Path "env.list" -Value "$($key)=$($value)"
}
变量组截图:
输出文件
env.list
:
bar=barValue
baz=bazValue
foo=fooValue
secret=
但是,正如您提到的,您的变量组中存储有机密,这些机密无法通过 API 获取,请参阅:https://developercommunity.visualstudio.com/t/secret-variables-is-null-when-read-通过-rest-ap/224229
我的建议是使用某种秘密保管库(例如 Azure Key Vault),然后您可以创建一个脚本来执行与我上面的脚本类似的操作。这是另一个可能对此有所帮助的答案:Dynamically get key Vault Secrets in Azure DevOps Pipeline