我们如何使用Cake构建对安全的NuGet服务器进行身份验证?

时间:2016-08-07 20:22:07

标签: c# msbuild nuget build-server cakebuild

我们正在使用Cake Build自动化我们的构建,我们使用nuget.org的NuGet软件包,但我们也有自己的NuGet Feed服务器,它具有访问的用户名/密码认证。我们如何利用带有身份验证的自定义NuGet源服务器来使用Cake Build?

1 个答案:

答案 0 :(得分:10)

Cake使用NuGet.exe来安装工具,插件和NuGet别名。

除非您在#tool / #addin指令中指定了源或提供给NuGet别名,否则NuGet.exe将在当前路径中查找nuget.config并最终结束在当前用户的全局设置(%AppData%\NuGet\NuGet.config)。

您有几个选择,如果您不想更改Cake文件或存储库中的任何内容,那么您可以在全球范围内为您的用户存储凭据,NuGet.exe将选择这些示例:

nuget sources Update -Name [name of source] -Source [uri to your source] -UserName [your username] -Password [your password]

免责声明某些版本的NuGet.exe和dotnet CLI存在加密密码问题,解决方法是添加-StorePasswordInClearText这样的

nuget sources Update -Name [name of source] -Source [uri to your source] -UserName [your username] -Password [your password] -StorePasswordInClearText

然后您的凭据以纯文本格式保存,这样做的缺点是您的凭据保存在纯文本中。

您还可以通过指定nuget.config / #tool指令和NuGet别名的特定来源来覆盖#addin设置。

#tool指令

下面是一个示例,用于说明为#tool指令

提供源代码
#tool "NUnit.ConsoleRunner"
or
#tool nuget:?package=NUnit.ConsoleRunner&version=3.4.0

变为

#tool nuget:[source]?package=NUnit.ConsoleRunner
or
#tool nuget:[source]?package=NUnit.ConsoleRunner&version=3.4.0

,即官方的V2 nuget feed

#tool nuget:https://www.nuget.org/api/v2?package=NUnit.ConsoleRunner
or
#tool nuget:https://www.nuget.org/api/v2?package=NUnit.ConsoleRunner&version=3.4.0

#addin指令

下面是一个示例,用于说明为#addin指令

提供源代码
#addin "Cake.Slack"
or
#addin nuget:?package=Cake.Slack&version=0.4.0

变为

#addin nuget:[source]?package=Cake.Slack
or
#addin nuget:[source]?package=Cake.Slack&version=0.4.0

,即官方的V2 nuget feed

#addin nuget:https://www.nuget.org/api/v2?package=Cake.Slack
or
#addin nuget:https://www.nuget.org/api/v2?package=Cake.Slack&version=0.4.0

NuGet别名

NuGet aliases拥有NuGetAddSourceNuGetHasSource等命令,可以直接使用源代码,如果您希望在NuGet恢复步骤之前向CI添加源代码,这些内容非常棒下面:

var source = new {
                Name = EnvironmentVariable("PRIVATE_FEED_NAME"),
                Source = EnvironmentVariable("PRIVATE_FEED_SOURCE"),
                ApiUserName = EnvironmentVariable("PRIVATE_FEED_USERNAME"),
                ApiKey = EnvironmentVariable("PRIVATE_FEED_PASSWORD")
             };

if (!NuGetHasSource(source.SourceUrl))
{
    NuGetAddSource(
        source.Name,
        source.SourceUrl,
        new NuGetSourcesSettings {
            UserName = source.ApiUserName,
            Password = source.ApiKey
        }
    );
}

以上内容只会为您现有的nuget.config添加来源,但您也可以覆盖NuGetInstall&的NuGet来源。 NuGetRestore别名。

NuGetInstall

NuGetInstall别名具有带NuGetInstallSettings工具设置类的重载,该类具有Source属性,您可以使用该属性覆盖使用哪些Feed,例如:

NuGetInstall("MyNugetPackage", new NuGetInstallSettings {
    Source = new []{ "https://api.nuget.org/v3/index.json" }
});

NuGetRestore

类似地,NuGetRestore别名具有重载,允许您指定具有NuGetRestoreSettings属性的Source,您可以使用该属性覆盖使用哪些Feed,例如:

var solutions = GetFiles("./**/*.sln");
// Restore all NuGet packages.
foreach(var solution in solutions)
{
    Information("Restoring {0}", solution);
    NuGetRestore(
        solution,
        new NuGetRestoreSettings {
            Source = new []{ "https://api.nuget.org/v3/index.json" }
        }
    );
}

结论

有几种方法可以解决您的问题。

此外,当您在计算机上配置了多个源时,通过指定源可以获得改进的NuGet恢复/安装性能,但当前项目仅使用官方项目,然后跳过通过所有已配置提供并直接进入

但是,如果您的Feed有身份验证,那么您需要为使用nuget.exeNuGetAddSource别名的用户添加凭据。

提示对于那些使用MyGet的人,它有pre-authenticated url:s你可以在不添加源的情况下使用,但只是指定了Restore / Install的Source属性,这是敏感信息所以不要将它们存储在构建脚本中,而应该存储为环境变量