2015-12-18 10 views
9

Uso il plug-in Jenkins PowerShell per creare un progetto.Il plug-in Jenkins PowerShell viene sempre creato correttamente

Tuttavia, ho trovato che Jenkins considera sempre la mia build di successo, indipendentemente da ciò che digito nel comando Windows PowerShell.

Ecco un esempio:

enter image description here

Come si può vedere, asdf non è un comando legale. Jenkins dovrebbe darmi FAILURE dopo la costruzione.

Ma l'uscita della console mi dà:

Started by user admin 
Building in workspace C:\Users\Administrator\.jenkins\jobs\Test\workspace 
[workspace] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\ADMINI~1\AppData\Local\Temp\hudson2092642221832331776.ps1'" 
The term 'asdf' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. 
At C:\Users\ADMINI~1\AppData\Local\Temp\hudson2092642221832331776.ps1:1 char:5 
+ asdf <<<< 
    + CategoryInfo   : ObjectNotFound: (asdf:String) [], CommandNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

Finished: SUCCESS 

penso che il risultato dell'esecuzione di PowerShell dovrebbe dipendere $lastexitcode.

Si tratta di un errore del plug-in PowerShell?

+1

Nello script PowerShell quando si verifica un errore, utilizzare "exit x" dove x è un numero diverso da zero. Vedi se Jenkins ritiene che sia fallito allora. – DanL

+0

Sì, Jenkins considera "uscita 1" come fallita. – Brian

+1

Quindi modificare gli script per uscire con un codice di errore diverso da zero se si verifica un errore. Se vuoi che dipenda solo da $ lastexitcode allora in fondo al tuo script controlla $ lastexitcode e usa exit 1 se applicabile. – DanL

risposta

1

Per l'ultima versione del plug-in (Version 1.3 Sept 18 2015), è necessario utilizzare $ LastExitCode per eseguire il fail di una build.

versione 1.3 (settembre 18 2015)

  • PowerShell ora viene eseguito in modalità non interattiva per impedire prompt interattivi da appendere l'accumulo
  • PowerShell ora gira con ExcecutionPolicy impostato su "Bypass" per evitare strategia di esecuzione emette
  • script ora di uscita con $ LastExitCode, causando i codici di uscita diverso da zero a segnare una build fallito
  • Aggiunto aiuto e elenco delle variabili di ambiente disponibili (incluse le traduzioni inglese e francese)
+0

Questa risposta rispecchia semplicemente le note di rilascio del plug-in che non sembrano rispecchiare con precisione il funzionamento del plug-in. Le note dicono "gli script ora escono con $ LastExitCode" che ho letto come "Quando il plugin copia i comandi in un file' .ps1' da eseguire, aggiunge 'exit $ LastExitCode' alla fine dello script generato in modo che Jenkins catturare e reagire al fallimento. " Questo è esattamente ciò che accade, aggiungendo manualmente che la riga 'exit' non è necessaria. Tuttavia, nemmeno un comando non valido causa il fallimento della compilazione, anche con il 'exit' generato sul posto. –

+0

@ChrisNelson Dal link che hai postato .... _ "Per intercettare questo codice di uscita utilizza la variabile $ LastExitCode PowerShell." _ E, tuttavia, la mia risposta è stata accettata come risposta. Non sono d'accordo con la necessità di aggiungere il comando 'exit'. – rrirower

+0

Non sono d'accordo con la necessità di aggiungere anche l'exit. Il plugin lo fa. L'OP si chiedeva come gestire 'asdf' e noto che un comando che non può essere trovato non imposta' $ LastExitCode', genera un'eccezione. –

5

A partire dal 1.3, il plugin non gestirà le eccezioni come quelli di comandi mancanti. È possibile farlo da soli con try/catch:

try 
{ 
    asdf 
} 
catch 
{ 
    write-host "Caught an exception" 
    exit 1 
} 

Vedi MSDN di più.

5

Per quanto mi riguarda, volevo che la sceneggiatura si fermasse e non venisse a mancare in Jenkins non appena si è verificato un errore. Ciò è stato realizzato con l'aggiunta di questo per l'inizio dello script:

$ ErrorActionPreference = "Stop"

Questo è discusso qui: How to stop a PowerShell script on the first error?

+0

Questa è l'unica soluzione che ha funzionato per me. Inserisco variabili nello script e tutto funziona con l'eccezione degli errori. Questo finalmente segna la build come un errore quando c'è un errore nello script PS. Grazie! – rspring1975

0

Ecco come ho implementato la soluzione di RRIROWER. Spero che sia d'aiuto.

<yourscript>.ps1; exit $lastexitcode 

Assicurati che i tuoi script di PowerShell escano con il valore desiderato.
Eseguire l'"exit <value>" come ultima riga.

0

In definitiva, Ho dovuto ricorrere alla seguente configurazione in Jenkins poiché nessuna delle soluzioni qui ha funzionato per me. La risposta di Chris Nelson mi ha portato sulla strada giusta. Stiamo invocando lo chef-cliente da remoto, quindi abbiamo dovuto fare un po 'di magia per ottenere la sessione PS remota per parlare con il locale e passare lo stato a Jenkins.

  • $ res fornisce l'output di chef-cliente.
  • $ lastsuccess è vero o falso in base alle regole PS di engagment.

Ovviamente, dovrai fornire le tue variabili di ambiente! :)

Write-host "Deploying $env:Computer with $env:Databag data bag... " 
$secstr = ConvertTo-SecureString $env:Password -AsPlainText -Force 
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $env:User, $secstr 
$s = New-PSSession -ComputerName $env:Computer -Credential $cred 
$res = Invoke-Command -Session $s -ScriptBlock { try {chef-client} catch {exit 1}} 
$lastsuccess = Invoke-Command -Session $s -ScriptBlock {$?} 
Remove-PSSession $s 
write-host " --- " 
write-host $res 
write-host " --- " 
if($lastsuccess) 
{ 
    write-host "chef deployment completed" 
    exit 0 
} 
write-host "chef deployment had errors" 
exit 1