【发布时间】:2015-02-14 23:42:35
【问题描述】:
我们有一个通过 clickonce 部署的业务线应用程序。我可以毫无问题地构建和发布应用程序,但是当我尝试使用持续集成(构建每个签入)时,我收到以下错误:
2>C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5):错误 MSB4044: 没有为“SignFile”任务指定所需参数“CertificateThumbprint”的值。
[C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]
完成执行任务“SignFile”——失败。
我们使用在 AD 中注册为 Trusted Publisher 的代码签名证书对应用程序(更具体地说:ClickOnce 清单)进行签名。
证书存储在我本地工作站的证书存储中。证书也在构建服务器的证书存储中(1. 在个人存储中,2. 在 TFSBuildServiceHost 服务帐户的个人存储中,3. 在 tfs/构建服务器本身的个人存储中)。
在哪里使用 Visual Studio 2013 Update 4、C#、.Net 4.5 和 TFS 2013 Update 4。
我不知道是什么导致了这个错误,感谢任何帮助。
编辑:
我忘了提到几周前 tfs 构建运行良好。我没有改变任何东西,我验证了项目文件(Pulse.csproj)没有改变,并且我也有一些成功的构建与确切的 Pulse.csproj 文件/构建定义。我很确定它一定是 tfs 服务器上的东西。我记得微软在一些关于证书基础设施的更新方面遇到了一些麻烦,这可能是相关的吗?
编辑 2: 我尝试使用以下命令通过命令行构建项目:
"C:\Program Files (x86)\MSBuild\12.0\bin\amd64\MSBuild.exe" C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln
构建失败并显示以下消息:
CleanPublishFolder:删除目录“bin\Debug\app.publish\”。 _DeploymentComputeClickOnceManifestInfo:创建目录“bin\Debug\app.publish”。
将文件从“obj\Debug\Pulse.exe”复制到 “bin\Debug\app.publish\Pulse.exe”。 C:\程序文件 (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): 错误 MSB3482:签名时出错:SignTool.exe 没有 成立。 [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj] 完成建筑项目 “C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj”(默认 目标) -- 失败。完成建筑项目 “C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln”(默认目标) -- 失败。
构建失败。
“C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln”(默认目标) (1) -> "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (默认目标) (2) -> (_DeploymentComputeClickOnceManifestInfo 目标)-> C:\Program 文件 (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): 错误 MSB3482:签名时出错:SignTool.exe 没有 成立。 [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]
0 Warning(s) 1 Error(s)
Signtool 肯定存在于服务器上。 signtool 的路径是:“C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe”和“C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin \signtool.exe"
最有趣的部分是我可以使用不同的 msbuild 工具构建解决方案。
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln
编辑 3:
我安装了Windows Software Development Kit (SDK) for Windows 8,现在我可以通过命令行构建解决方案。因此,代码签名证书已安装并可用。
但是 TFS 构建失败。
这是从 tfsbuild 日志文件收集的错误输出:
Task "AL"
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64\AL.exe /culture:de /out:obj\Debug\de\Pulse.resources.dll /platform:AnyCPU /template:obj\Debug\Pulse.exe /embed:obj\Debug\Pulse.View.Localization.CreditsView.de.resources /embed:obj\Debug\Pulse.View.Localization.PulseMainWindow.de.resources
Microsoft (R) Assembly Linker version 12.0.20806.33440
Copyright (C) Microsoft Corporation. All rights reserved.
Done executing task "AL".
2>Done building target "GenerateSatelliteAssemblies" in project "Pulse.csproj".
2>Target "CreateSatelliteAssemblies" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "CoreBuild" depends on it):
2>Done building target "CreateSatelliteAssemblies" in project "Pulse.csproj".
Target "SetWin32ManifestProperties" skipped. Previously built successfully.
Target "_DeploymentComputeNativeManifestInfo" skipped, due to false condition; ('$(GenerateClickOnceManifests)'!='true') was evaluated as ('true'!='true').
2>Target "CleanPublishFolder" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "_DeploymentComputeClickOnceManifestInfo" depends on it):
Task "RemoveDir" skipped, due to false condition; ('$(PublishDir)'=='$(OutputPath)app.publish\' and Exists('$(PublishDir)')) was evaluated as ('bin\Debug\app.publish\'=='bin\Debug\app.publish\' and Exists('bin\Debug\app.publish\')).
2>Done building target "CleanPublishFolder" in project "Pulse.csproj".
Target "_DeploymentGenerateTrustInfo" skipped, due to false condition; ('$(TargetZone)'!='') was evaluated as (''!='').
2>Target "_DeploymentComputeClickOnceManifestInfo" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "GenerateApplicationManifest" depends on it):
Task "Copy"
Creating directory "bin\Debug\app.publish".
Copying file from "obj\Debug\Pulse.exe" to "bin\Debug\app.publish\Pulse.exe".
Done executing task "Copy".
Using "SignFile" task from assembly "Microsoft.Build.Tasks.v12.0, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "SignFile"
2>C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): error MSB4044: The "SignFile" task was not given a value for the required parameter "CertificateThumbprint". [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]
Done executing task "SignFile" -- FAILED.
2>Done building target "_DeploymentComputeClickOnceManifestInfo" in project "Pulse.csproj" -- FAILED.
2>Target "_CheckForCompileOutputs" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "_CleanGetCurrentAndPriorFileWrites" depends on it):
2>Done building target "_CheckForCompileOutputs" in project "Pulse.csproj".
Target "_SGenCheckForOutputs" skipped, due to false condition; ('$(_SGenGenerateSerializationAssembliesConfig)' == 'On' or ('@(WebReferenceUrl)'!='' and '$(_SGenGenerateSerializationAssembliesConfig)' == 'Auto')) was evaluated as ('Off' == 'On' or (''!='' and 'Off' == 'Auto')).
2>Target "_CleanGetCurrentAndPriorFileWrites" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "_CleanRecordFileWrites" depends on it):
Task "ReadLinesFromFile"
Done executing task "ReadLinesFromFile".
Task "ConvertToAbsolutePath"
Done executing task "ConvertToAbsolutePath".
Task "FindUnderPath"
Comparison path is "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse".
Done executing task "FindUnderPath".
Task "FindUnderPath"
Comparison path is "C:\Builds\1\Pulse\DefaultBuild\bin\".
Done executing task "FindUnderPath".
Task "FindUnderPath"
Comparison path is "obj\Debug\".
Done executing task "FindUnderPath".
Task "RemoveDuplicates"
Done executing task "RemoveDuplicates".
2>Done building target "_CleanGetCurrentAndPriorFileWrites" in project "Pulse.csproj".
2>Target "_CleanRecordFileWrites" in file "C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets" from project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (target "CoreBuild" depends on it):
Task "RemoveDuplicates"
Done executing task "RemoveDuplicates".
Task "MakeDir"
Done executing task "MakeDir".
Task "WriteLinesToFile"
Done executing task "WriteLinesToFile".
2>Done building target "_CleanRecordFileWrites" in project "Pulse.csproj".
2>Done Building Project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (default targets) -- FAILED.
1>Done executing task "MSBuild" -- FAILED.
1>Done building target "Build" in project "Pulse.sln" -- FAILED.
1>Done Building Project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln" (default targets) -- FAILED.
Build FAILED.
"C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln" (default target) (1) ->
"C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (default target) (2) ->
(_DeploymentComputeClickOnceManifestInfo target) ->
C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): error MSB4044: The "SignFile" task was not given a value for the required parameter "CertificateThumbprint". [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]
0 Warning(s)
1 Error(s)
编辑 4:
Visual Studio 2013 未安装在我们的构建服务器上。我已经浏览过日志文件,发现 TFS Build 使用了存储在 C:\Program Files (x86)\MSBuild\12.0\bin\amd64\ 中的 MSBuild.exe。
由于我可以使用 MSBuild.exe 在构建服务器上构建项目,而不是 TFS Build,因此我可以确定证书本身不是问题。
我在未修改任何设置的情况下创建了一个新的构建定义,但仍然收到相同的错误消息。
我还修复了构建服务器上的 TFS 安装,但没有运气。
我将服务器上 C:\Program Files (x86)\MSBuild\12.0\bin\amd64\ 文件夹中存储的所有 *.targets 文件与客户端计算机上相同位置的 *.targets 文件进行了比较。有 100% 相同。
不用说,我可以在我的客户端机器上毫无问题地构建项目(通过 VS2013 和命令行)。
我删除并重新注册/创建了构建服务/控制器/代理。结果还是一样。
我被困在这里了。有什么想法吗?
【问题讨论】:
-
你在构建服务器上也安装了私钥吗?
-
是的。证书也在构建服务器的证书存储中(1. 在个人存储中,2. 在 TFSBuildServiceHost 服务帐户的个人存储中,3. 在 tfs/构建服务器本身的个人存储中)。
-
证书在构建服务器上并不意味着安装了私钥。如果您尝试从构建服务器导出它,您是否会看到“使用私钥导出”选项?
-
是的,我被要求输入私钥的密码。但是我没有选中“将此密钥标记为可导出”选项。因此我无法导出它。
-
是 VS 2013 更新 4 破坏了它吗?我有同样的问题,这是我第一次发现其他人有这个问题。你解决了吗?
标签: msbuild certificate clickonce code-signing