我有几个 secret 存储在 Azure KeyVault 中。不幸的是,我找不到通过 VSTS(Visual Studio Team Services)将参数传递给我的 .net Core 2.0 测试运行的方法
文档说 Keyvault secret 只能通过 VSTS 变量提供 - 很公平 - 但我实际上该怎么做?我在网上找到的所有信息似乎都已过时或不起作用。
例如 - 考虑 RunSettings 文件:
<RunSettings>
<TestRunParameters>
<Parameter name="webAppUrl" value="http://localhost" />
<Parameter name="webAppUserName" />
<Parameter name="webAppPassword" />
</TestRunParameters>
</RunSettings>
我尝试通过 cmd 行传递最后 2 个参数的值,如下所示:
vsts.console MyTest.dll /Settings:vsts.runsettings -- -webAppUserName foo
vsts.console MyTest.dll /Settings:vsts.runsettings -- webAppUserName=foo
dotnet test -s vsts.runsettings -- -webAppUserName foo
dotnet test -s vsts.runsettings -- webAppUserName=foo
但这没有效果 - webAppUserName 值保持为空(我可以看到 webAppUrl 的值,所以我知道我的代码是正确的!)
我还尝试了 VSTS“dotnet 测试”任务以及我的 VSTS 2017 版本中的“VsTest”任务。 VsTest 提供了一个Override test run parameters 设置 - 根据工具提示,我试过:
-webAppUserName user -webAppPassword somethingSecret
同样 - 没有效果!
最初我使用 xUnit 并遇到完全相同的问题 - 即无法找到通过 VSTS 传递参数的方法 - 所以我尝试了 MSTest,但同样的问题。
回到我最初的注入(inject) KeyVault secret 的问题 通过 VS Studio 在本地,我能够从我的测试中执行以下操作:
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", true, true)
...
.AddAzureKeyVault(...)
不幸的是,当通过 VSTS 运行时,测试运行器只是挂起(即我不得不在几分钟后停止它)并且 没有 如果我使用任何一个测试步骤的日志输出
.AddAzureKeyVault(...) 或 .AddEnvironmentVariables()
所以我尝试使用 VSTS 变量组 - 并将其链接到 KeyVault。但是,无法通过环境变量(直接从 C# 使用 Enviroment.GetEnvironmentVariable(...))访问 keyvault secret - 所以这不好。他们说你只能通过 VSTS 变量将这些传递给任务......因此我的问题!
旁白: 即使我可以使用环境变量,它也不是最佳选择,因为在使用 .AddAzureKeyVault() 时我可以提供自定义 IKeyVaultSecretManager,例如,用“:”字符替换特殊分隔符——这意味着我可以嵌套我的 json 配置值- 例如如果我的配置文件中有这个:
{ "A" : { "B" : "somevalue" } }
然后使用普通的配置生成器,我可以通过 config["A:B"] 访问上面的内容。不幸的是,KeyVault 不喜欢“:”字符 - 因此您必须将其替换为“--”之类的内容,然后使用自定义 IKeyVaultSecretManager 将“--”替换为“:”(效果很好并确保变量是根据在配置构建器中注册的提供商的顺序正确覆盖)
求助!圣诞节我想要的只是不要将我的 KeyVault secret 放入 Git 中......但是 VSTS KeyVault grinch 正在破坏我的乐趣......我肯定错过了什么??
最佳答案
只是更新
我最近建立了一个新的 xUnit .NET Core 2.0 项目。对于这个项目,我在将环境变量传递给 Azure DevOps 时没有遇到任何问题。基本上,您要做的就是:
- 创建构建管道变量 - 例如
ASPNETCORE_ENVIRONMENT
- 创建 Visual Studio 测试任务
- 在您的 xUnit 项目中,只需使用
System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
鉴于上述工作,.AddEnvironmentVariables()
配置方法现在也应该可以正常工作。
这种机制也可用于为每个测试环境加载不同的配置文件。
对我来说,这就是我所需要的,因为我有一个很好的简单方法来将特定于环境的选项传递给集成测试
关于c# - 将 KeyVault secret 传递给 VSTS 中的 .net core 2 xUnit/MsTest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48093878/