2009-09-24 28 views
8

Sto usando Hudson versione 1.324 per CI e hanno un paio di questioni:Come ottenere Hudson CI per eseguire uno script PowerShell?

Ambiente:

  • Windows Server 2008
  • PowerShell v1.0
  • Hudson 1.324 esecuzione come servizio
  • Hudson Powershell Plugin installato
  • Psake (aka "Powershell Make/Rake" disponibile da Github) 0.23 (Tutte le attuali/versioni più recenti come di questo post iniziale)

Ho uno script PowerShell (PS) che lavora per la compilazione, test NUnit correre, e in caso di successo, creare un file 7z dell'uscita. Lo script PS funziona dalla riga di comando, sia sulla mia casella di sviluppo locale, sia sul server CI su cui è installato Hudson.

1) Politica di esecuzione con PowerShell.

Inizialmente ho eseguito una console PS sul server, ho eseguito Set-ExecutionPolicy Unrestricted, che consente di eseguire qualsiasi script. (Sì, mi rendo conto dei problemi di sicurezza qui, sto cercando di far funzionare qualcosa e Unrestricted dovrebbe rimuovere i problemi di sicurezza in modo da potermi concentrare su altri problemi.)

[Questo ha funzionato e mi ha permesso di sparare Script di costruzione PS di Hudson ieri. . Poi ho incontrato un altro problema, ma ne parleremo più al punto # 2]

volta Hudson potrebbe sparare uno script PS, si lamentò con il seguente errore:

"C:\Windows\system32\WindowsPowerShell\v1.0\powershell "& 'OzSystems.Tools\psake\psake.ps1' '.\oz-build.ps1'" The term 'OzSystems.Tools\psake\psake.ps1' is not recognized as a cmdlet, funct ion, operable program, or script file. Verify the term and try again. At line:1 char:2 + & <<<< 'OzSystems.Tools\psake\psake.ps1' '.\oz-build.ps1'"

Utilizzando lo stesso comando linea, sono in grado di eseguire manualmente lo script PS dalla riga di comando. Tuttavia, Hudson non è in grado di convincere PS a fare lo stesso. Dopo aver esaminato la documentazione PS aggiuntiva, ho provato anche questo:

"& 'OzSystems.Tools\psake\psake.ps1' '.\oz-build.ps1'" 

e si è verificato un errore simile. Non sembra esserci alcuna documentazione per il plugin PowerShell per Hudson. Ho esaminato tutti i file di plug-in di PowerShell e non vedo nulla che sia configurabile. Non riesco a trovare un file di registro per Hudson per ottenere ulteriori informazioni.

Qualcuno può aiutarmi a superare questo?

2) Ho passato ieri a lottare con il numero 1. Sono arrivato in questo AM e ho cercato di scavare di nuovo, dopo aver riavviato il server/servizio Hudson, e ora sembra che ExecutionPolicy sia stato reimpostato su Restricted. Ho fatto ciò che ha funzionato ieri, ho aperto una console PS e Set-ExecutionPolicy a Unrestricted. Mostra Unrestricted nella console PS, ma Hudson dice che non ha diritti per l'esecuzione di script PS. Ho riaperto una nuova console PS e ho confermato che lo ExecutionPolicy è ancora Unrestriced - lo è. Evidentemente Hudson non è consapevole di questo cambiamento. Riavviare di nuovo il servizio Hudson non cambia la visione di Hudson della politica.

Qualcuno sa cosa sta succedendo qui?

Grazie, Derek

+0

Sto correndo nello stesso identico problema. Onestamente come questa cosa PowerShell sia supposta essere paragonabile a bash è al di là di me. Troppa sicurezza! – stimms

+0

Passare attraverso il processo doloroso che sta firmando lo script (http://www.hanselman.com/blog/SigningPowerShellScripts.aspx) non ha aiutato. FYI. – stimms

+0

Assicurati di non impostare set-executionpolicy per -Scope CurrentUser invece di -Scope LocalMachine ... e assicurati che Hudson non stia cercando di eseguire i tuoi build su un altro client;) – Jaykul

risposta

1

Per la domanda # 1, provate questo (supponendo che si sta utilizzando PowerShell 2.0):

"C: \ Windows \ system32 \ WindowsPowerShell \ v1.0 \ PowerShell -ExecutionPolicy illimitato - file OzSystems.Tools \ psake \ psake.ps1 C: \ {percorso} \ oz-build.ps1 "

Si sta utilizzando". " per il percorso di oz-build.ps1. Sospetto che sarà necessario fornire il percorso completo del file oz-build.ps1 per farlo funzionare. A meno che l'infrastruttura che esegue il comando sopra non abbia la directory corrente impostata correttamente. E anche se è impostato correttamente per il "processo", ciò riguarda solo le chiamate API .NET/Win32 e non i cmdlet di PowerShell. La directory corrente in PowerShell viene tracciata in modo diverso rispetto alla dir corrente del processo poiché PowerShell può avere più spazi di esecuzione in esecuzione simultaneamente. Quel tipo di valore globale e mutabile non funziona in questo scenario concorrente.

Come per la domanda n. 2, su quale account viene eseguito il servizio Hudson? Assicurati che l'account abbia eseguito Set-ExecutionPolicy RemoteSigned (o senza restrizioni).

+0

Keith, I ' ho provato i suggerimenti per # 1. Gli stessi problemi Per # 2, Sì, mi sono assicurato che ExecutionPolicy sia impostato per l'account in cui Hudson è in esecuzione. Non è vincolato quando effettuo l'accesso manualmente per verificare ExecutionPolicy. Hudson continua a dire che gli script sono disabilitati. Siamo sul punto di puntare su Powershell e provare Rake con Hudson. Sembra che PS non sia ancora pronto per il prime time, o almeno non si stia comportando in modo abbastanza coerente per farci affidamento. Grazie per l'input Keith! – user178557

+0

Prima di rinunciare, provare a utilizzare il parametro -ExecutionPolicy Unrestricted. Ho modificato l'esempio sopra per mostrare questo. –

1

Ho avuto gli stessi problemi di voi (come avete visto dai miei commenti). Ho rinunciato all'avvio di PowerShell e mi sono trasferito a eseguire le cose utilizzando l'utilità di avvio file batch. Anche se avevo impostato il sistema in modo illimitato, quell'impostazione non sembrava avere importanza per il launcher di hudson. Non so se viene eseguito in qualche altro contesto o qualcosa del genere, anche aggiungendo cose al profilo globale. Quello che ho finito per fare era correre

powershell " set-executionpolicy Unrestricted; & 'somefile.ps1'" 

che fa quello che mi serve, anche se non è l'ideale. Ho inviato per e-mail l'autore del plugin e aggiornerò.

2

durante l'esecuzione di PowerShell da un'operazione pianificata o Hudson si desidera:

  1. specificare il parametro -ExecutionPolicy (nel tuo caso: -Ex Unrestricted)
  2. specificare che il comando utilizzando sia-Command { ... } o -FileNON ENTRAMBI e non senza specificare quale intendi.

Prova questa (tranne che non mi consiglia di utilizzare percorsi relativi):

PowerShell.exe -Ex Unrestricted -Command "C:\Path\To\OzSystems.Tools\psake\psake.ps1" ".\oz-build.ps1" 

Per essere chiari, questo funzionerà anche:

PowerShell.exe -Ex Unrestricted -Command "&{&'OzSystems.Tools\psake\psake.ps1' '.\oz-build.ps1'}" 

La prima stringa dopo -Command viene interpretato come IL NOME DI UN COMANDO e ogni parametro dopo viene passato a quel comando come parametro. La stringa NON è uno script, è il nome di un comando (in questo caso, un file di script) ... è impossibile put "&'OzSystems.Tools\psake\psake.ps1'" ma è possibile inserire "OzSystems.Tools\psake\psake.ps1" anche se ha spazi.

citare l'aiuto (run PowerShell -?) sottolineatura mia:

-Command

Executes the specified commands (and any parameters) as though they were typed at the Windows PowerShell command prompt, and then exits, unless NoExit is specified. The value of Command can be "-", a string. or a script block.

If the value of Command is "-", the command text is read from standard input.

If the value of Command is a script block, the script block must be enclosed in braces ({}). You can specify a script block only when running PowerShell.exe in Windows PowerShell. The results of the script block are returned to the parent shell as deserialized XML objects, not live objects.

If the value of Command is a string, Command must be the last parameter in the command , because any characters typed after the command are interpreted as the command arguments.

1

Ho appena ricevuto attraverso questo problema esatto. Che dolore!

Se si esegue una JVM a 32 bit su un sistema Windows a 64 bit, assicurarsi di impostare il criterio di esecuzione per l'interfaccia Powershell a 32 bit. Ho trovato il mio 32 bit eseguibile qui:

C:\Windows\syswow64\Windowspowershell\v1.0\powerhsell.exe 

Gli ambienti PowerShell a 32 e 64 bit sono completamente distinti in modo da impostare la strategia di esecuzione in una sola non ha alcun effetto sull'altro.

7

Mi sono appena imbattuto nel problema dell'esecuzione di script PowerShell in hudson. Il fatto è che si sta eseguendo un processo a 32 bit di Java e Hudson è stato configurato per 64 bit ma non per 32 bit. Guarda il seguente thread che abbiamo creato su microsoft.

http://social.technet.microsoft.com/Forums/en/winserverpowershell/thread/a9c08f7e-c557-46eb-b8a6-a19ba457e26d

Se il pigro. 1. Avviare powershell (x86) dal menu Start come amministratore 2. Impostare il criterio di esecuzione su remotesigned

Esegui questa volta e il tuo homefree.

+0

Grazie! Ho avuto un problema leggermente diverso rispetto al poster originale, ma l'impostazione della politica di esecuzione in x86 ha risolto il problema. –

Problemi correlati