Wir haben eine Business-App, die über clickonce bereitgestellt wird. Ich kann die Anwendung ohne Probleme bauen und veröffentlichen, aber wenn ich versuche, Continuous Integration zu verwenden (Build jeden Check-in) bekomme ich folgende Fehlermeldung:Die Task "SignFile" hat keinen Wert für den erforderlichen Parameter "CertificateThumbprint" erhalten.
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.
Wir unterzeichnen die Anwendung (um genauer zu sein: die Clickonce Manifest) unter Verwendung eines Codesignaturzertifikats, das im AD als Trusted Publisher registriert ist.
Das Zertifikat wird im Zertifikatspeicher auf meiner lokalen Arbeitsstation gespeichert. Das Zertifikat befindet sich auch im Zertifikatspeicher des Buildservers (1. Im persönlichen Speicher, 2. im persönlichen Speicher des TFSBuildServiceHost-Dienstkontos und 3. im persönlichen Speicher des tfs/build-Servers).
Wo sind mit Visual Studio 2013 Update 4, C#, .NET 4.5 und TFS 2013 Update 4
Ich habe keine Ahnung, was diesen Fehler verursacht, wird jede Hilfe dankbar.
EDIT:
Ich vergaß zu erwähnen, dass die tfs build Fein vor ein paar Wochen gearbeitet. Ich habe nichts geändert, ich habe überprüft, dass sich die Projektdatei (Pulse.csproj) nicht geändert hat, und ich hatte auch ein paar erfolgreiche Builds mit dieser genauen Pulse.csproj-Datei/Build-Definition. Ich bin mir ziemlich sicher, dass es etwas auf dem tfs-Server sein muss. Ich erinnere mich, dass Microsoft einige Probleme mit einigen Updates bezüglich der Zertifikatsinfrastruktur hatte.
EDIT 2: Ich habe versucht, das Projekt über die Kommandozeile mit folgendem Befehl zu bauen:
"C:\Program Files (x86)\MSBuild\12.0\bin\amd64\MSBuild.exe" C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln
Der Build mit der folgenden Meldung fehlschlägt:
CleanPublishFolder: Removing directory "bin\Debug\app.publish\". _DeploymentComputeClickOnceManifestInfo: Creating directory "bin\Debug\app.publish".
Copying file from "obj\Debug\Pulse.exe" to "bin\Debug\app.publish\Pulse.exe". C:\Program Files (x86)\MSBuild\12.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(3450,5): error MSB3482: An error occurred while signi ng: SignTool.exe not found. [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj] Done Building Project "C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj" (default targets) -- FAILED.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 MSB3482: An error occurred while sig ning: SignTool.exe not found. [C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse\Pulse.csproj]
0 Warning(s) 1 Error(s)
Das Signtool auf jeden Fall existiert auf dem Server. Der Pfad zum signtool lautet: "C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.1A \ Bin \ signtool.exe" und "C: \ Programme \ Microsoft SDKs \ Windows \ v7.1 \ Bin" \ signtool.exe "
Der interessanteste Teil ist, dass ich die Lösung mit einem anderen Msbuild-Tool erstellen kann.
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln
EDIT 3:
Ich installierte die Windows Software Development Kit (SDK) for Windows 8 und jetzt kann ich die Lösung über die Befehlszeile erstellen. Somit ist das Codesignaturzertifikat installiert & verfügbar.
Aber der TFS-Build schlägt fehl.
Hier ist die Fehlerausgabe aus dem tfsbuild Logfile gesammelt:
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)
EDIT 4:
Visual Studio 2013 auf unserem Build-Server nicht installiert. Ich habe die Protokolldatei bereits durchgesehen und festgestellt, dass der TFS-Build das in C: \ Programme (x86) \ MSBuild \ 12.0 \ bin \ amd64 \ gespeicherte MSBuild.exe verwendet.
Da ich das Projekt auf dem Buildserver mithilfe von MSBuild.exe als TFS Build erstellen kann, kann ich sicher sein, dass das Zertifikat selbst kein Problem ist.
Ich erstellte eine neue Builddefinition ohne Änderung der Einstellungen, aber ich bekomme immer noch die gleiche Fehlermeldung.
Ich reparierte auch die TFS-Installation auf dem Build-Server, aber kein Glück.
Ich habe alle * .targets-Dateien verglichen, die im Ordner C: \ Programme (x86) \ MSBuild \ 12.0 \ bin \ amd64 \ auf dem Server mit den * .targets-Dateien am selben Speicherort auf meinem Clientcomputer gespeichert sind. Dort 100% identisch.
Unnötig zu sagen, dass ich das Projekt ohne Probleme auf meinem Client-Rechner (über VS2013 und Befehlszeile) erstellen kann.
Ich löschte und neu registriert/erstellt den Build Service/Controller/Agent. Das Ergebnis ist immer noch dasselbe.
Ich stecke hier fest. Irgendwelche Ideen?
tun Sie einen privaten Schlüssel auf Build-Server als auch installiert? – avs099
Ja ist es. Das Zertifikat befindet sich auch im Zertifikatspeicher des Buildservers (1. Im persönlichen Speicher, 2. im persönlichen Speicher des TFSBuildServiceHost-Dienstkontos und 3. im persönlichen Speicher des tfs/build-Servers). – Joel
Das Zertifikat auf dem Build-Server bedeutet nicht, dass der private Schlüssel installiert ist. Wenn Sie versuchen, es vom Build-Server zu exportieren, erhalten Sie eine Option "Export mit privatem Schlüssel"? – avs099