19

我正在尝试在 TFS 2008 上设置持续集成构建。在我要构建的项目中,我使用密钥进行签名。此密钥使用密码。我无法构建它,因为在构建过程中 TFS 想要显示一个无法显示的对话框。我想我需要在服务器上手动构建项目,但服务器上只安装了 TFS 资源管理器和构建部件。关于如何让我的项目正确构建的任何建议?

这是 TFS 给出的错误:

C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets(1805,7):错误 MSB4018:“ResolveKeySource”任务意外失败。System.InvalidOperationException:当应用程序未在 UserInteractive 模式下运行时显示模式对话框或表单不是有效操作。指定 ServiceNotification 或 DefaultDesktopOnly 样式以显示来自服务应用程序的通知。在 System.Windows.Forms.Form.ShowDialog(IWin32Window 所有者) 在 System.Windows.Forms.Form.ShowDialog() 在 Microsoft.Build.Tasks.ResolveKeySource.ResolveAssemblyKey() 在 Microsoft.Build.Tasks.ResolveKeySource.Execute()

4

1 回答 1

34

下面的这篇文详细介绍了确切的步骤

设置密钥文件

使用项目属性中的 Visual Studio“签名”选项卡创建受密码保护的私钥/公钥对 (KeyPair.pfx) 从密钥对中提取公钥并将其复制到单独的文件 (Key.snk) sn.exe -p 密钥对.pfx 密钥.snk

将 KeyPair.pfx 复制到您的构建服务器。我使用 C:\Program Files\MSBuild\KeyFile.pfx,因为它可以通过 $(MSBuildExtensionsPath) MSBuild 属性访问。将 KeyPair.pfx 文件移动到安全可靠的位置。密码也要保密。将 Key.snk 复制到开发人员可以访问的共享位置。为签名设置项目

对于您要签名的每个程序集:

  1. 打开项目属性 | 签约页面
  2. 选择 [X] 对程序集签名复选框。
  3. 选中 [X] 仅延迟符号复选框。
  4. 从密钥文件下拉列表中选择。
  5. 浏览到共享位置并选择 Key.snk 文件
  6. snk 文件将被复制到您分配给它的每个项目目录
  7. 将密钥文件从您的一个项目复制到解决方案项中,以便您可以将其用于测试运行配置

为重新签名设置测试运行配置

如果您想检测您的程序集并为您的单元测试启用代码覆盖率,那么您需要指定一个用于重新签名的密钥文件。

打开 LocalTestRun.testrunco​​nfig 文件 在 Code Coverage 选项卡上,选择密钥作为重新签名密钥文件

在开发人员工作站上禁用强名称验证

由于您仅使用公钥进行延迟签名,因此 .NET CLR 程序集验证将因本地构建的程序集而失败。当验证失败时,您将无法运行或调试程序集。

为了在开发中克服这个问题,您需要对本地构建的程序集禁用强名称验证,并使用您的公钥延迟签名。

打开 Visual Studio 命令提示符类型: sn.exe -tp Key.snk

这将输出一些数据,包括令牌。

类型: sn -Vr *,YOUR_KEY_TOKEN

例子:sn -Vr *,0123456789abcdef

这将为使用您的公钥签名的所有程序集禁用强名称验证。您可以使用以下命令列出强名称验证的当前设置:sn -Vl

为 Team Build 安装私钥

由于私钥 (Key.pfx) 受密码保护 - Team Build 无法访问它。感谢Nagaraju Palla 的博客:在 Team Build 中使用受密码保护的签名密钥,我们有了一个解决方案。

以构建服务帐户登录 Team Build 服务器 在 Visual Studio 中打开项目 在 Visual Studio 中构建项目 系统将提示您输入私钥文件的密码。输入密码 关闭 Visual Studio 并注销 私钥文件现在已安装在构建服务帐户的本地证书存储中,Team Build 可以访问它而无需再次提示输入密码。此证书存储与构建服务帐户的密码一样安全。(提示:使其与密钥文件的密码一样强大)

更新 TFSBuild.proj 构建脚本

Team Build 有权访问私钥文件和密码。这允许它对程序集进行完全签名。

要覆盖项目设置并指示 Team Build 使用私钥文件并禁用部分签名,我们需要在 TFSBuild.proj 中设置 CustomPropertiesForBuild 属性

签出您的 TFSBuild.proj 构建脚本 搜索占位符属性(默认情况下在第 130 行附近)将其替换为以下内容:SignAssembly=true;DelaySign=false;AssemblyOriginatorKeyFile=$(MSBuildExtensionsPath)\Key.pfx 签入您的更改排队生成验证团队生成输出

要检查 Team Build 是否正确地为您的程序集强命名,您可以使用 sn.exe 实用程序来验证强名称签名。

打开 Visual Studio 命令提示符类型:sn.exe -vf assemblyname.dll

您还可以同时验证所有程序集:

打开 Visual Studio 命令提示符类型: FOR %a IN (*.dll) DO sn.exe -vf %a

于 2009-06-29T08:07:06.880 回答