Azure Pipelines 中的秘密变量

Secret Variables in Azure Pipelines

我有一个 Azure 管道需要访问秘密令牌才能联系其他服务。我一直在关注 documentation,但它似乎没有像我预期的那样工作。作为一个最小的例子,我正在尝试将 cachix_token 中的变量写入文件。

  - bash: |
      set -ex
      mkdir -p packages
      echo $CACHIX_AUTH_TOKEN > packages/token
    env:
      CACHIX_AUTH_TOKEN: $(cachix_token)

但是,当我下载生成的令牌文件时,内容是文字

$(cachix_token)

如何让 yaml 替代秘密变量?

更新

下面是我为管道定义秘密变量的屏幕截图。

如果文件中有文字$(cachix_token),则表示 Azure Pipeline 无法替换该变量。因为这意味着您没有在任何地方定义它。您也可以使用此扩展名来确认这一点 - Print all variables.

这里有一份如何设置 secret variable 的文档。但是,您也可以使用 Azure Key Vault 来存储变量,然后从中获取值。使用内置扩展,它还将它们作为机密加载。

我重复你的步骤:

steps:
  - bash: |
      set -ex
      mkdir -p packages
      echo $CACHIX_AUTH_TOKEN > packages/token
      cat packages/token
    env:
      CACHIX_AUTH_TOKEN: $(cachix_token)

得到这个:

+ mkdir -p packages
+ echo ***
+ cat packages/token
***

这意味着该变量已被正确替换。

我最终发现,Azure Pipelines 不允许分支访问秘密变量。因此,即使秘密变量是为管道定义的,如果您是从分叉而不是主回购执行拉取请求,那么秘密变量是 not 定义的并且你会看到我上面解释的行为。

documentation 中所述,这可以通过管道的 gui 中的 Make secrets available to builds of forks 复选框绕过。然而,这确实打开了一个巨大的安全漏洞,任何人都可以制作恶意 PR,为他们提供您所有秘密的逐字副本。