将KeyVault秘密传递给VSTS中的.net core 2 xUnit / MsTest

时间:2018-01-04 11:05:22

标签: c# .net azure-devops mstest azure-keyvault

我在Azure KeyVault中存储了几个秘密。不幸的是我找不到通过VSTS(Visual Studio Team Services)将参数传递给我的.net Core 2.0测试的方法

文档说Keyvault的秘密只能通过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值保持为null(我可以看到webAppUrl的值,所以我知道我的代码是正确的!)

我也尝试过VSTS&#34; dotnet测试&#34;任务以及&#34; VsTest&#34;我的VSTS 2017版本的任务。 VsTest提供覆盖测试运行参数设置 - 根据工具提示,我尝试了:

-webAppUserName user -webAppPassword somethingSecret

再次 - 没有效果!

最初我使用了xUnit并且有完全相同的问题 - 即coudn找出了通过VSTS传递参数的方法 - 所以我尝试了MSTest,但同样的问题。

回到我最初注入KeyVault秘密的问题 在本地通过VS Studio,我可以从我的测试中做到以下几点:

var config = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", true, true)
                ...
                .AddAzureKeyVault(...)

不幸的是,当通过VSTS运行时,测试运行器只是暂停(即我必须在几分钟后停止它),如果我使用

,则没有日志输出用于测试步骤

.AddAzureKeyVault(...) .AddEnvironmentVariables()

所以我尝试使用VSTS变量组 - 并将其链接到KeyVault。但是,密钥保密密钥无法通过环境变量访问(直接从C#使用Enviroment.GetEnvironmentVariable(...)) - 因此没有任何好处。他们说你只能通过VSTS变量将这些传递给任务...因此我的问题!

除了: 即使我可以使用环境变量,它也不是最佳的,因为在使用.AddAzureKeyVault()时,我可以提供自定义的IKeyVaultSecretManager,例如,用&#39;替换特殊的分隔符:&#39; character - 这意味着我可以嵌套我的json配置值 - 例如如果我在配置文件中有这个:

{ "A" : { "B" : "somevalue" } }  

然后使用普通配置构建器我可以通过config [&#34; A:B&#34;]访问上面的内容。不幸的是,KeyVault并不喜欢&#34;:&#34;角色 - 所以你必须用&#34; - &#34;然后使用自定义IKeyVaultSecretManager替换&#34; - &#34;用&#34;:&#34; (效果很好并确保根据在配置构建器中注册的提供程序的顺序正确覆盖变量)

请帮忙!圣诞节我想要的就是不要把我的KeyVault秘密放进Git ......但是VSTS KeyVault的笑容正在破坏我的乐趣......当然我错过了什么?

2 个答案:

答案 0 :(得分:2)

只需更新

我最近建立了一个新的xUnit .NET Core 2.0项目。对于这个项目,将环境变量传递给Azure DevOps没有问题。基本上,您要做的就是:

  • 创建一个构建管道变量-例如ASPNETCORE_ENVIRONMENT
  • 创建Visual Studio测试任务
  • 在您的xUnit项目中,只需使用System.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")

鉴于以上方法可行,.AddEnvironmentVariables()配置方法现在应该也可以正常工作。 此机制还可用于在每个测试环境中加载不同的配置文件。

对我来说,这就是我所需要的,因为我有一种很好的简便方法将特定于环境的选项传递给集成测试

答案 1 :(得分:0)

覆盖测试运行参数的格式类似于AppURL=$(DeployURL);Port=8080而不是-name value

Supplying Run Time Parameters to Tests