2015-12-18 4 views
9

Ich verwende Jenkins PowerShell-Plugin, um ein Projekt zu erstellen.Jenkins Powershell-Plugin baut immer erfolgreich

Allerdings habe ich festgestellt, dass Jenkins immer meinen Build erfolgreich betrachtet, egal was ich in Windows PowerShell Befehl eingeben.

Hier ist ein Beispiel:

enter image description here

Wie Sie sehen können, asdf ist kein Recht Befehl. Jenkins sollte mir nach dem Build FAILURE geben.

Aber die Ausgabe der Konsole gibt mir:

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 

denke ich, das Ausführungsergebnis von Powershell sollte auf $lastexitcode abhängen.

Ist dies ein Fehler des PowerShell-Plugins?

+1

In Ihrem Powershell-Skript, wenn ein Fehler auftritt, verwenden Sie "exit x", wobei x eine Zahl ungleich Null ist. Sehen Sie, ob Jenkins es als gescheitert ansieht. – DanL

+0

Ja, Jenkins betrachtet "Exit 1" als fehlgeschlagen. – Brian

+1

Dann ändern Sie Ihre Skripte, um mit einem Fehlercode ungleich Null zu beenden, wenn ein Fehler auftritt. Wenn Sie möchten, dass es nur von $ lastexitcode abhängt, dann prüfen Sie am Ende Ihres Skripts $ lastexitcode und verwenden Sie gegebenenfalls exit 1. – DanL

Antwort

1

Pro letzte Version des Plugins (Version 1.3 Sept 18 2015) müssen Sie $ LastExitCode verwenden, um einen Build fehlzuschlagen.

Version 1.3 (September 18 2015)

  • Powershell läuft nun im nicht-interaktiven Modus interaktive Eingabeaufforderungen, um zu verhindern das Hängen der Build
  • Powershell läuft jetzt mit ExcecutionPolicy auf "Bypass" eingestellt zu vermeiden Ausführungsrichtlinie gibt
  • Scripts Schließen des Fensters mit $ lastexitcode, nicht-Null-Exit-Codes verursacht einen Build markieren als
  • hinzugefügt Hilfe versagt und Liste der verfügbaren Umgebungsvariablen (einschließlich Englisch und Französisch Übersetzungen)
+0

Diese Antwort gibt nur die Versionshinweise des Plugins wieder, die die Funktionsweise des Plugins nicht genau wiedergeben. Die Notizen sagen "Skripte beenden jetzt mit $ LastExitCode", die ich als "Wenn das Plugin kopiert Ihre Befehle in eine .ps1" -Datei zur Ausführung liest, fügt es 'exit $ LastExitCode' am Ende des generierten Skripts, so dass Jenkins wird erfassen und reagieren auf den Fehler. " Dies ist genau das, was passiert, wenn man manuell hinzufügt, dass die "exit" -Zeile nicht benötigt wird. Ein ungültiger Befehl führt jedoch nicht dazu, dass der Build fehlschlägt, selbst wenn der generierte Exit vorhanden ist. –

+0

@ChrisNelson Von Ihrem Link, den Sie gepostet haben .... _ "Um diesen Exit-Code einzufangen, verwenden Sie die PowerShell-Variable $ LastExitCode." _ Und dennoch wurde meine Antwort als Antwort akzeptiert. Ich stimme der Notwendigkeit nicht zu, den Befehl 'exit' hinzuzufügen. – rrirower

+0

Ich stimme nicht mit der Notwendigkeit überein, auch den 'exit' hinzuzufügen. Das Plugin macht das. Das OP fragte sich, wie man mit 'asdf' umgehen sollte, und ich stelle fest, dass ein Befehl, der nicht gefunden werden kann,' $ LastExitCode' nicht setzt, sondern eine Ausnahme auslöst. –

5

Ab 1.3, das Plugin nicht Ausnahmen behandeln wie die von fehlenden Befehlen. Sie können sich selbst tun dies mit try/catch:

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

Siehe MSDN für mehr.

5

Für mich wollte ich das Skript zu stoppen und in Jenkins bald fehlschlagen, als es einen Fehler traf. Dies wird durch das Hinzufügen dieser zu Beginn des Skripts erreicht wurde:

$ ErrorActionPreference = "Stop"

Dies wird hier diskutiert: How to stop a PowerShell script on the first error?

+0

Dies ist die einzige Lösung, die für mich funktionierte. Ich injiziere Variablen in das Skript und hatte alles mit Ausnahme von Fehlern funktioniert. Dies markiert schließlich den Build als Fehler, wenn ein Fehler im PS-Skript auftritt. Vielen Dank! – rspring1975

0

Dies ist, wie ich RRIROWER-Lösung implementiert. Ich hoffe es hilft.

<yourscript>.ps1; exit $lastexitcode 

Stellen Sie sicher, dass Ihre Powershell-Skripts mit dem gewünschten Wert beendet werden.
Führen Sie "exit <value>" als letzte Zeile.

0

Schließlich musste ich auf die folgende Konfiguration in Jenkins zurückgreifen, da keine der Lösungen hier für mich funktionierte. Chris Nelsons Antwort hat mich auf den richtigen Weg gebracht. Wir rufen den Chef-Client aus der Ferne an, also mussten wir ein wenig Zauberei machen, um die Remote-PS-Sitzung dazu zu bringen, das Lokale zu sprechen und dann den Status an Jenkins weiterzugeben.

  • $ res gibt die Ausgabe von Chef-Client.
  • $ sasesuccess ist wahr oder falsch gemäß den PS-Regeln des Engagements.

Natürlich müssen Sie Ihre eigenen Umgebungsvariablen liefern! :)