如何在 Azure DevOps Services 中传递/存储可从单元测试访问的机密

Kon*_*kst 1 vstest azure-devops azure-pipelines

我需要在从环境变量中检索的单元测试执行中使用秘密密码。

测试由版本 2.* 中的 Visual Studio 测试任务执行

_networkCredential = new NetworkCredential(Environment.GetEnvironmentVariable("DomainAccountUsername"), Environment.GetEnvironmentVariable("DomainAccountPassword"));
Run Code Online (Sandbox Code Playgroud)

如果我直接从 Powershell 设置 DomainAccountPassword 一切正常,测试成功结束,但我不想向团队中的其他用户显示密码。

Write-Host "##vso[task.setvariable variable=DomainAccountPassword;]MyExamplePassword"
Run Code Online (Sandbox Code Playgroud)

传递库组中定义的机密不起作用,导致身份验证错误。

Write-Host "##vso[task.setvariable variable=DomainAccountPassword;]$(secretPassword)"
Run Code Online (Sandbox Code Playgroud)

如何将机密传递给 VSTS 任务,以便它可以在外部 API 中进行身份验证?

谢谢你!

Jos*_*ust 6

根据文档

秘密变量使用 2048 位 RSA 密钥进行静态加密。代理上的机密可供任务和脚本使用(因此请注意谁有权更改您的管道)。

...

与普通变量不同,它们不会自动解密为脚本的环境变量。不过,您可以明确地将它们映射到其中。

要将秘密传递给脚本,请使用脚本任务输入变量的环境部分。

在脚本中使用机密

将变量设置为秘密: 在此处输入图片说明

将变量显式传递给脚本 在此处输入图片说明

并按名称在脚本中使用新的 env var $env:topshelfPassword

如果您的管道是 YAML 而不是在经典编辑器中

您不应在 YAML 文件中设置秘密变量。相反,您应该使用 Web 界面在管道编辑器中设置它们。这些变量的范围仅限于您设置它们的管道。

以下示例显示如何将 Web 界面中设置的名为 mySecret 的秘密变量传递给脚本。

YAML

steps:

- powershell: |
    # Using an input-macro:
    Write-Host "This works: $(mySecret)"

    # Using the env var directly:
    Write-Host "This does not work: $env:MYSECRET"

    # Using the mapped env var:
    Write-Host "This works: $env:MY_MAPPED_ENV_VAR"    # Recommended
  env:
    MY_MAPPED_ENV_VAR: $(mySecret)
Run Code Online (Sandbox Code Playgroud)

请注意该变量是如何在 web ui 中声明的,mySecret以及对典型的非秘密变量 ( $env:mySecret) 有效的方法不是 b/c 它是秘密。但是,在 YAML 中有效但在经典体验中无效的方法(我相信我是正确的)是使用“输入宏”语法 ( $(mySecret))。