将 Azure DevOps 变量组中的值加载到文件中的最佳方法是什么?

问题描述 投票:0回答:1

我目前正在开发一些 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
获取变量,但我无法找到正确解析它们的方法。实现这一目标的最佳方法是什么?或者,如果这是一个不好的方法,那么解决该问题的最佳实践解决方案是什么?

docker powershell azure-devops azure-pipelines azure-cli
1个回答
0
投票

实现您正在寻找的目标的一个选择是使用 API 来检索变量组中存储的所有变量的键和值。

API 文档:https://learn.microsoft.com/en-us/rest/api/azure/devops/distributedtask/variablegroups/get?view=azure-devops-rest-7.1&tabs=HTTP

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

© www.soinside.com 2019 - 2024. All rights reserved.