首页 > 解决方案 > Azure DevOps Pipeline 动态列出变量组的成员

问题描述

我正在尝试让 YAML 管道构建一个 JSON 文件以用作Cypress.env.json. 一些值需要来自变量组(最终绑定到 Azure Key Vault)。我希望它是动态构建的,因此如果将秘密添加到 Key Vault 并通过变量组公开,它将作为 JSON 文件的新属性写出,而无需修改 YAML 管道。我希望我在这个答案中找到了一个技巧,它描述了一个名为的未记录函数convertToJson,它允许将管道对象作为 JSON 字符串传递给脚本。所以我试了一下:

- job:
  variables:
  - group: DevVariableGroup
  steps:
  - bash: echo "${{ convertToJson(variables) }}"
    displayName: 'Get an Object - Bash'

只要我得到一个包含所有在编译时可用的变量的 JSON 字符串,这就是有效的。不幸的是,变量组提供的变量不在其中。我只能convertToJson使用模板语法使函数工作,而不是宏或运行时语法。

我想不出另一种方法来动态访问变量组提供的变量。有什么建议么?

标签: yamlcypressazure-devops-pipelines

解决方案


我想我会回到这个问题并分享我们找到的解决方案,以防它对其他人有帮助。机密保存在 Key Vault 中,并使用AzureKeyVault@1 任务进行检索。这会将值下载到变量中,因此无需依赖变量组来公开 Key Vault 的内容。一旦它们是变量,我们就可以使用replacetokens@3 任务。因此,我们更改了用于填充值的 JSON 文件,以便它可以处理该任务。

两项任务让我们得到了我们需要的东西。

  - task: AzureKeyVault@1
    displayName: 'Read vault'
    inputs:
      azureSubscription: ${{ parameters.azureSubscription }}
      KeyVaultName: $(keyVaultName)
      SecretsFilter: '*'
      RunAsPreJob: false

  - task: replacetokens@3
    inputs:
      targetFiles: '**/cypress.json'
      encoding: 'auto'
      writeBOM: true
      actionOnMissing: 'warn'
      keepToken: false
      tokenPrefix: '#{'
      tokenSuffix: '}#'
      useLegacyPattern: false
      enableTransforms: false
      enableTelemetry: true

推荐阅读