我有一个 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
,还有很多其他的,但似乎都不起作用。
有人知道我做错了什么吗?
我怀疑这是两件事的结合:
vso
命令设置变量。这会创建一个“pipeline”变量。如果我没记错的话,管道变量在作业运行的start处映射为环境变量,因此如果您在运行时创建新变量,它将不会映射为环境变量。
是问题的一部分。 基本上,如果您想在 PowerShell 中从管道机密创建环境变量,请使用
[System.Environment]::SetEnvironmentVariable('FooSecret', $env:Foo)
。
从哲学角度来看,我强烈建议反对使用管道变量进行应用程序配置;这将您的应用程序与 Azure Pipelines 紧密耦合。通常,您会使用 Azure KeyVault 等秘密存储机制,并将应用程序与其集成,以便可以在运行时自动检索秘密值,而无需依赖设置的环境变量。