繁体   English   中英

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

[英]Passing KeyVault secrets to .net core 2 xUnit/MsTest in VSTS

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

文档说,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“dotnet测试”任务以及VSTS 2017版本中的“VsTest”任务。 VsTest提供了覆盖测试运行参数设置 - 并且根据工具提示,我尝试了:

-webAppUserName user -webAppPassword somethingSecret

再次 - 没有效果!

最初我使用xUnit并且有完全相同的问题 - 即没有找到通过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,例如,用':'字符替换特殊分隔符 - 这意味着我可以嵌套我的json配置值 - 例如,如果我在配置文件中有这个:

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

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

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

只是一个更新

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

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

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

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

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

将运行时参数提供给测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM