如何在 C# 中从 Azure DevOps 发布管道获取和使用秘密变量?

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

我有一个 Azure DevOps 发布管道。在该管道中,我有一个 .NET 6 集成测试阶段,它使用 C# 代码:

System.Environment.GetEnvironmentVariable("MySetting");

在运行时获取和检索不同的设置,以便针对不同的环境/用户/等运行测试。我在发布管道的“变量组”部分中设置了这些设置,我的代码使用了它们,一切都运行良好。

这是我的变量组在 DevOps 中的样子:

例如,在测试运行期间,我的代码调用:

System.Environment.GetEnvironmentVariable("SearchServiceAdminApiKey");

它直接从变量组中提取变量,并且效果很好。

问题:

现在我需要将其中一些敏感变量更改为SECRETS。所以我将它们更新为变量组中的秘密:

并且,[根据文档][3],:

与普通变量不同,它们不会自动解密为脚本的环境变量。您需要显式映射秘密变量。

酷,有道理。所以现在,在 powershell 脚本任务中,我尝试显式映射它们,然后将它们设置为环境变量以供我的 C# 代码使用,如下所示:

在这里,我尝试手动将它们映射为我的脚本使用的环境变量:

但是,它不起作用。此 powershell 脚本运行后,每当 C# 代码调用时,我的测试就会开始:

System.Environment.GetEnvironmentVariable("MySecret");

对于任何这些秘密,它只返回 null/空。我一直在互联网上搜索,看起来我正在做的应该工作......我也尝试了许多不同的语法变体,我尝试使用

$(MySecret)
而不是
$env:MySecret
,还有很多其他的,但似乎都不起作用。

有人知道我做错了什么吗?

c# azure-devops environment-variables azure-pipelines .net-6.0
1个回答
1
投票

我怀疑这是两件事的结合:

  1. 您对秘密版本和非秘密版本使用相同的名称
  2. 您正在使用
    vso
    命令设置变量。这会创建一个“pipeline”变量。如果我没记错的话,管道变量在作业运行的start处映射为环境变量,因此如果您在运行时创建新变量,它将不会映射为环境变量。
  3. #2 绝对是一个问题,而#1
可能

是问题的一部分。 基本上,如果您想在 PowerShell 中从管道机密创建环境变量,请使用

[System.Environment]::SetEnvironmentVariable('FooSecret', $env:Foo)

从哲学角度来看,我强烈建议

反对

使用管道变量进行应用程序配置;这将您的应用程序与 Azure Pipelines 紧密耦合。通常,您会使用 Azure KeyVault 等秘密存储机制,并将应用程序与其集成,以便可以在运行时自动检索秘密值,而无需依赖设置的环境变量。

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