代码之家  ›  专栏  ›  技术社区  ›  Sorskoot

具有密码保护的协同设计失败的Team Foundation服务器构建

  •  19
  • Sorskoot  · 技术社区  · 15 年前

    我正在尝试在tfs 2008上建立一个持续的集成构建。在我想要构建的项目中,我使用一个密钥进行签名。此密钥使用密码。我无法让它生成,因为在生成期间,tfs希望显示一个无法显示的对话框。我认为我需要在服务器上手工构建项目,但是只有TFS资源管理器和构建部件安装在服务器上。关于如何使我的项目正确构建有什么建议吗?

    这是tfs给出的错误:

    C:\windows\microsoft.net\framework\v3.5\microsoft.common.targets(1805,7): 错误MSB4018:“ResolveKeySource” 任务意外失败。 System.InvalidOperationException:无效操作异常: 显示模式对话框或窗体 当应用程序未运行时 用户交互模式无效 操作。指定 服务通知或 默认仅显示桌面样式 来自服务的通知 应用程序。在 System.Windows.Forms.Form.ShowDialog(Iwin32窗口 业主) System.Windows.Forms.Form.ShowDialog()。 在 microsoft.build.tasks.resolveKeySource.resolveassemblykey()。 在 Microsoft.Build.Tasks.ResolveKeySource.Execute()。

    1 回复  |  直到 13 年前
        1
  •  34
  •   Daniel Schaffer    13 年前

    这个 blog post 下面详细介绍了具体步骤

    设置密钥文件

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

    将keypair.pfx复制到构建服务器。我使用c:\program files\msbuild\keyfile.pfx,因为它随后可以由$(msbuildExtensionsPath)msbuild属性访问。 将keypair.pfx文件移到安全位置。密码也要保密。 将key.snk复制到开发人员可以访问的共享位置。 设置要签名的项目

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

    1. 打开项目属性签名页
    2. 选中[X]对程序集签名复选框。
    3. 选中[X]Delay Sign Only复选框。
    4. 从“密钥文件”下拉列表中选择。
    5. 浏览到共享位置并选择key.snk文件
    6. snk文件将被复制到分配给它的每个项目目录中。
    7. 将某个项目中的密钥文件复制到解决方案项中,以便将其用于测试运行配置。

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

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

    打开localtestrun.testrunconfig文件 在“代码覆盖率”选项卡上,选择密钥作为重新签名密钥文件。

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

    由于只使用公钥延迟签名,.NET CLR程序集验证将在本地生成程序集时失败。当验证失败时,您将无法运行或调试程序集。

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

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

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

    Type: sn -Vr *,YOUR_KEY_TOKEN

    例子: sn -Vr *,0123456789abcdef

    这将禁用用公钥签名的所有程序集的强名称验证。 您可以列出强名称验证的当前设置: SN—Vl

    正在安装团队生成的私钥

    由于私钥(key.pfx)受密码保护,因此“团队构建”无法访问它。多亏了 Nagaraju Palla’s Blog: Using Password Protected Signing Keys in Team Build ,我们有一个解决方案。

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

    正在更新tfsbuild.proj生成脚本

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

    要重写项目设置并指示team build使用私有密钥文件并禁用部分签名,我们需要在tfsbuild.proj中设置custompropertiesforbuild属性。

    签出tfsbuild.proj生成脚本 搜索占位符属性(默认在第130行附近) 替换为以下内容: signassembly=true;delaysign=false;assemblyoriginatorkeyfile=$(msbuildExtensionsPath)\key.pfx 签入您的更改 排队构建 验证团队生成输出

    要检查TeamBuild是否对程序集进行了正确的强名称命名,可以使用sn.exe实用工具验证强名称签名。

    打开Visual Studio命令提示 Type: sn.exe-vf assemblyname.dll文件

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

    打开Visual Studio命令提示 Type: 对于在(*.dll)中的%a,执行sn.exe-vf%a