我正在尝试在TFS 2008上设置持续集成构建。在我要构建的项目中,我使用密钥进行签名。此密钥使用密码。我无法构建它,因为在构建期间TFS想要显示一个无法显示的对话框。我想我需要在服务器上手动构建项目,但只有TFS资源管理器和构建部件安装在服务器上。关于如何让我的项目正确构建的任何建议?
这是TFS给出的错误:
C:\ Windows \ Microsoft.NET \框架\ 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()
答案 0 :(得分:34)
以下blog post详细说明了具体步骤
设置密钥文件
使用项目属性中的Visual Studio“签名”选项卡创建受密码保护的私钥/公钥对(KeyPair.pfx) 从密钥对中提取公钥并将其复制到单独的文件(Key.snk) sn.exe -p KeyPair.pfx Key.snk
将KeyPair.pfx复制到构建服务器。我使用C:\ Program Files \ MSBuild \ KeyFile.pfx,因为它可以被$(MSBuildExtensionsPath)MSBuild属性访问。 将KeyPair.pfx文件移动到安全&安全的位置。保密也是密码。 将Key.snk复制到开发人员可以访问它的共享位置。 设置签名项目
对于您要签名的每个装配体:
设置测试运行配置以重新签名
如果要检测程序集并为单元测试启用代码覆盖率,则需要指定用于重新签名的密钥文件。
打开LocalTestRun.testrunconfig文件 在“代码覆盖率”选项卡上,选择密钥作为“重新签名密钥文件”
禁用开发人员工作站上的强名称验证
由于您只使用公钥进行延迟签名,因此.NET CLR程序集验证将失败并在本地构建程序集。验证失败后,您将无法运行或调试程序集。
要在开发过程中克服这个问题,您需要对本地构建的程序集禁用强名称验证,并使用公钥进行延迟签名。
打开Visual Studio命令提示符
类型:
sn.exe -tp Key.snk
这将输出一些数据,包括令牌。
类型:
sn -Vr *,YOUR_KEY_TOKEN
示例:sn -Vr *,0123456789abcdef
这将禁用使用您的公钥签名的所有程序集的强名称验证。 您可以列出强名称验证的当前设置: sn -Vl
为团队构建安装私钥
由于私钥(Key.pfx)受密码保护 - Team Build无法访问它。感谢Nagaraju Palla’s Blog: Using Password Protected Signing Keys in 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(* .dll)DO sn.exe -vf%a