2013-02-11 15 views
5

Sto provando a creare un file .sln VS con più file .vcproj in C++. Il file della soluzione viene generato utilizzando CMake e ho questo componente che funziona in Jenkins (con il plugin del builder CMake). Per costruire il file della soluzione, sto usando msbuild. Sono in grado di creare la soluzione utilizzando sia Visual Studio e dalla riga di comando con il seguente comando:Msbuild funziona tramite VS e riga di comando, ma non riesce via Jenkins

C:\Jenkins\workspace\SonioTest>"C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" /t:Rebuild bin/SonIO.sln 

Questo costruisce con successo (sulla stessa macchina che Jenkins risiede).

Tuttavia, sto tentando di automatizzare questa parte della build in Jenkins e la build non riesce con un paio di errori C1083 ("Cannot open source file: '..\path\to\file.ext': No such file or directory). Ho provato ad usare sia il plug-in di msgen di Jenkins che lo stesso comando che funziona nel terminale come un passo di generazione "Esegui comando batch di Windows", con lo stesso risultato.

Quando si utilizza il comando batch passo accumulo di Windows, posso vedere nel log che il comando in esecuzione:

C:\Jenkins\workspace\SonioTest>"C:\Windows\Microsoft.NET\Framework\v4.0.30319 msbuild.exe" /t:Rebuild bin/SonIO.sln

... è esattamente lo stesso di quello che funziona da linea di comando , incluso la directory di lavoro.

Sto eseguendo Jenkins come servizio e ho l'accesso al servizio come account (con privilegi di amministratore). Qualcuno sa da quale directory Jenkins eseguirà i comandi batch?

Qualche idea del perché sto osservando questa differenza di comportamento tra Jenkins e la riga di comando?

+0

Credo che bisogna specificare il percorso assoluto alla soluzione utilizzando un segnaposto come% SPAZIO DI LAVORO% –

+0

Ho verificato che il comando viene eseguito da Jenkins dalla stessa directory di lavoro. Il tuo commento si applica ancora? Non sono sicuro al 100% di cosa intendi. – Kohanz

risposta

1

Senza sapere molto su VS build, sembra per lo più come un ambiente di installazione.

Il mio primo consiglio sarebbe di accertarmi, in Jenkins, di cambiare la directory nella stessa directory da cui è stato eseguito il buon comando e provarlo poi.

Inoltre, potrebbe voler provare a far funzionare Jenkins come app standalone.

E come servizio, forse consentire al servizio di "interagire con il desktop".

Spero che questo sia un buon vantaggio ...

+0

Ho verificato che è in esecuzione dalla stessa directory di lavoro del comando non Jenkins riuscito (vedere la mia modifica). La casella di controllo "Interagisci con il desktop" non è selezionabile poiché ho specificato il mio account utente (amministratore). – Kohanz

+0

Hai provato a eseguire Jenkins come processo e non come servizio? –

3

Questo è tanto una soluzione come una soluzione, ma ho finito per usare devenv invece di msbuild e funziona benissimo.

So che questo suggerisce fortemente come un problema ambientale, ma poiché non è un problema avere VS installato sul server di build, ho deciso di salvare il tempo che sarebbe stato speso nel buco del coniglio di msbuild.

1

L'ambiente utilizzato dall'account che l'agente slave Jenkins non è lo stesso ambiente che si utilizza quando si esegue la stessa riga di comando da un prompt. Confronta i due ambienti, nota la differenza, quindi aggiungili al lavoro di Jenkins.

Per ottenere l'ambiente dello schiavo durante l'esecuzione, fare fare un "set" da un comando di Windows Prompt

+0

Ho fatto questo (prima di passare a devenv) e l'ambiente slave Jenkins era quasi (non completamente) un superset del mio ambiente a riga di comando. Ho esaminato da vicino le variabili da fare con la compilazione (VC ...) ed erano praticamente le stesse, con lo schiavo Jenkins che ne aveva di extra. Apprezzo l'aiuto, ma a meno che non abbia una ragione convincente per passare da devenv.exe, preferirei non sprecare più tempo nelle indagini. – Kohanz

Problemi correlati