2014-12-16 29 views
9

Abbiamo una linea di app aziendale che viene distribuita tramite clickonce. Posso creare e pubblicare l'applicazione senza problemi, ma quando provo ad usare Continuous Integration (Build ogni check-in) ottengo il seguente errore:All'attività "SignFile" non è stato assegnato un valore per il parametro richiesto "CertificateThumbprint"

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.

Firmiamo l'applicazione (per essere più precisi: la ClickOnce manifest) utilizzando un certificato di firma del codice che è registrato in Active Directory come Trusted Publisher.

Il certificato è archiviato nell'archivio certificati sulla workstation locale. Il Certificato si trova anche nell'archivio certificati del server di build (1. Nel Personal Store, 2. nel Personal store del TFSBuildServiceHost Account del Servizio e 3. nel Personal store del server tfs/build stesso).

Dove si utilizza Visual Studio 2013 Update 4, C#, .Net 4.5 e TFS 2013 Aggiornamento 4.

non ho idea di che cosa provoca questo errore, ogni aiuto è apprezzato.


EDIT:

ho dimenticato di dire che la build TFS ha funzionato bene un paio di settimane fa. Non ho cambiato nulla, ho verificato che il file di progetto (Pulse.csproj) non è cambiato e ho anche avuto alcune build di successo con quella definizione esatta di file/build Pulse.csproj. Sono abbastanza sicuro che deve essere qualcosa sul server tfs. Ricordo che Microsoft ha avuto qualche problema con alcuni aggiornamenti relativi all'infrastruttura dei certificati che potrebbero essere correlati?


EDIT 2: ho cercato di costruire il progetto tramite riga di comando utilizzando questo comando:

"C:\Program Files (x86)\MSBuild\12.0\bin\amd64\MSBuild.exe" C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln

La build non riesce con il seguente messaggio:

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) 

Il SignTool sicuramente esiste sul server. Il percorso per il signtool è: "C: \ Programmi (x86) \ Microsoft SDK \ Windows \ v7.1A \ Bin \ signtool.exe" e "C: \ Programmi \ Microsoft SDK \ Windows \ v7.1 \ Bin \ signtool.exe "

La parte più interessante è che POSSO creare la soluzione utilizzando un diverso strumento msbuild.

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" C:\Builds\1\Pulse\DefaultBuild\src\Pulse\Pulse.sln


EDIT 3:

ho installato il Windows Software Development Kit (SDK) for Windows 8 e ora posso creare la soluzione tramite linea di comando. Pertanto, il certificato di firma del codice è installato & disponibile.

Ma la compilazione TFS non riesce.

Ecco l'output di errore raccolte dal file di log 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) 


EDIT 4:

Visual Studio 2013 non è installato sul nostro server di build. Ho già visitato il file di registro e ho scoperto che TFS Build utilizza MSBuild.exe archiviato in C: \ Programmi (x86) \ MSBuild \ 12.0 \ bin \ amd64 \.

Poiché posso costruire il progetto sul server di build utilizzando MSBuild.exe rispetto a TFS Build, posso essere sicuro che il certificato non è un problema.

Ho creato una nuova definizione di build senza modificare nessuna delle impostazioni, ma ottengo lo stesso messaggio di errore.

Ho anche riparato l'installazione TFS sul server di build, ma senza fortuna.

Ho confrontato tutti i file * .targets memorizzati nella cartella C: \ Programmi (x86) \ MSBuild \ 12.0 \ bin \ amd64 \ Folder sul server con i file * .targets nella stessa posizione sul computer client. Lì il 100% identico.

Inutile dire che posso costruire il progetto senza problemi sulla mia macchina client (tramite VS2013 e riga di comando).

Ho eliminato e re-registrato/creato il servizio di build/controller/agente. Il risultato è sempre lo stesso.

Sono bloccato qui. Qualche idea?

+0

avete una chiave privata installata sul server di build come bene? – avs099

+0

Sì, lo è. Il Certificato si trova anche nell'archivio certificati del server di build (1. Nel Personal Store, 2. nel Personal store del TFSBuildServiceHost Account del Servizio e 3. nel Personal store del server tfs/build stesso). Il certificato – Joel

+0

sul server di build non significa che la chiave privata sia installata. Se provi ad esportarlo dal build server, ottieni un'opzione "esporta con chiave privata"? – avs099

risposta

4

Questo è come ho risolto il problema:

I nostri servizi di compilazione sono stati configurati per essere eseguiti come NT AUTHORITY\NetworkService Ho semplicemente modificato questo al mio account utente. Si noti che il file * .pfx è già stato installato nell'archivio certificati personale.

Immagino che il problema era che l'utente NT AUTHORITY\NetworkService non ha il certificato richiesto nell'archivio certificati. Non ho ancora idea di come aggiungere certificati nell'archivio personale degli account di sistema. Tuttavia il mio problema è andato per ora anche se non mi piace il fatto che il servizio di compilazione viene eseguito con le mie credenziali.

+1

Penso che sia consigliabile eseguire Build-Processes come utente. Usiamo il nostro "dominio \ TfsBuild" -Utente. Quindi posso accedere al Build-Server con questo account e installare il certificato. – gReX

+0

Io uso TfsBuildService, poiché il nome è più descrittivo. – AMissico

2

tenta di aggiungere il certificato nella scheda firma di proprietà del progetto selezionando "Seleziona da negozio"

o

prova a cliccare "Crea certificato di prova" ...

-1

Ho avuto lo stesso problema. L'ho risolto in modo piuttosto strano. Sono andato alle proprietà del progetto quindi ho selezionato l'opzione 'Firma'. Sotto di esso ho deselezionato l'opzione Sign the ClickOnce e deselezionata l'opzione Sign the assembly. Il progetto è seguito in seguito.

Questa è una soluzione pericolosa e non viene offerta come soluzione permanente. Nel mio caso l'ho usata solo perché stavo lavorando su una copia locale e avevo bisogno di fare alcune correzioni, quindi avevo solo bisogno di far funzionare il progetto. In uno scenario di distribuzione del mondo reale non farlo.

+4

Ma poi il progetto non è più firmato. La firma è qualcosa che dobbiamo fare nel nostro ambiente di cooperazione. – Joel

+0

Non sono sicuro di cosa lo abbia causato esattamente dal momento che stiamo lavorando con il controllo del codice sorgente.Probabilmente non ho ottenuto tutti i file richiesti o la persona che ha creato il file di segno ha dimenticato di includere tutti i file necessari. Quindi perché ho aggiunto la mia risposta come una soluzione rapida e non la consiglierei come soluzione permanente. È necessario verificare che tutti i file siano presenti e non danneggiati. – Bryida

+0

Non è pericoloso non firmare? – Eniola

1

Un altro motivo per cui si potrebbe ottenere questo è se l'identificazione del certificato è stata modificata (vale a dire quando è stata rinnovata perché il vecchio certificato è scaduto) e non è più installato il vecchio certificato. Mi è successo proprio ora.

Soluzione: aprire il progetto in Visual Studio, accedere alla scheda Signing, fare clic su Seleziona da Store e assicurarsi che sia installato il certificato (nuovo) corretto. Questo ha risolto il problema per me.

10

Nota: Se si sta cercando una soluzione rapida e it is okay for your project to not be signed, allora è possibile farlo. Che incontro questo problema quando sto cercando un codice di esempio e using this quick fix solves my problem instantly.

  1. Vai alla proprietà del progetto
  2. Selezionare le opzioni di firma
  3. deselezionare la Firma l'ClickOnce manifesta
  4. Salva
  5. Re ` -run it
  6. (Opzionale) In alcuni casi è necessario ricostruirlo.

enter image description here

Se non funziona riprova di deselezionare la enable ClickOnce security settings che può essere situato su Security scheda.

enter image description here