it-swarm.com.de

So markieren Sie ein Build in Jenkins instabil, wenn Sie Shell-Skripts ausführen

In einem Projekt, an dem ich arbeite, verwenden wir Shell-Skripts, um verschiedene Aufgaben auszuführen. Einige Skripte sind SH/Bash, die Rsync ausführen, und andere sind PHP Skripte. In einem der PHP - Skripts werden einige Integrationstests ausgeführt, die in JUnit XML ausgegeben werden, Berichte zur Codeabdeckung und ähnliches.

Jenkins sind in der Lage, die Jobs als erfolgreich/fehlgeschlagen basierend Beendigungsstatus zu markieren. In PHP wird das Skript mit 1 beendet, wenn während des Laufs diese fehlgeschlagenen Tests festgestellt wurden. Die anderen Shell-Skripts führen Befehle aus und verwenden die Beendigungscodes, um einen Build als fehlgeschlagen zu kennzeichnen.

// :: End of PHP script:
// If any tests have failed, fail the build
if ($build_error) exit(1);

In der Jenkins-Terminologie ist ein instabiler Build als definiert

Ein Build ist instabil, wenn es erfolgreich erstellt wurde und ein oder mehrere Publisher es als instabil melden. Wenn beispielsweise der JUnit-Publisher konfiguriert ist und ein Test fehlschlägt, wird der Build als instabil markiert.

Wie kann ich Jenkins dazu bringen, einen Build als instabil zu markieren, anstatt nur Erfolg/Misserfolg beim Ausführen von Shell-Skripts?

67
HNygard

Verwenden Sie das Text-Finder Plugin.

Statt mit Status 1 zu beenden (was beim Build fehlschlagen würde), führen Sie Folgendes aus:

if ($build_error) print("TESTS FAILED!");

Aktivieren Sie dann den Text Finder in den Post-Build-Aktionen, stellen Sie den regulären Ausdruck so ein, dass er der gedruckten Nachricht entspricht (TESTS FAILED!), und aktivieren Sie das Kontrollkästchen "Unstable if found" unter diesem Eintrag.

51
Jan Hudec

Dies ist ohne Ausdruck von magischen Zeichenketten und ohne TextFinder möglich. Hier ist ein paar Infos dazu.

Grundsätzlich benötigen Sie eine .jar-Datei von http: // yourserver.com/cli, die in Shell-Skripts verfügbar ist. Anschließend können Sie den folgenden Befehl verwenden, um eine Build-Instable zu markieren:

Java -jar jenkins-cli.jar set-build-result unstable

Um den Build als instabil zu kennzeichnen, können Sie Folgendes verwenden:

failing_cmd cmd_args || Java -jar jenkins-cli.jar set-build-result unstable

Das Problem ist, dass jenkins-cli.jar über das Shell-Skript verfügbar sein muss. Sie können es entweder in einen leicht zugänglichen Pfad ablegen oder über das Shell-Skript des Jobs herunterladen:

wget ${JENKINS_URL}jnlpJars/jenkins-cli.jar
52
binaryLV

Moderne Jenkins-Versionen (seit 2.26, Oktober 2016) haben dieses Problem gelöst: Es ist nur eine erweiterte Option für den Build-Schritt "Shell ausführen"!

 exit code for build

Sie können einfach einen beliebigen Exit-Wert auswählen und einstellen. Wenn es passt, wird der Build instabil sein. Wählen Sie einfach einen Wert aus, der wahrscheinlich nicht durch einen realen Prozess in Ihrem Build gestartet wird.

22
Alan Franzoni

Sie sollten Jenkinsfile verwenden, um Ihr Build-Skript einzuhüllen, und markieren Sie den aktuellen Build einfach mithilfe von currentBuild.result = "UNSTABLE" als UNSTABLE.

 Bühne {
 status =/* Ihr Build-Befehl geht hier */
 if (status === "MARK-AS-UNSTABLE") {
 currentBuild.result = "UNSTABLE" 
 } 
 } 
9
poussma

sie sollten auch in der Lage sein, Groovy zu verwenden und zu tun, was der Textfinder getan hat

Markieren eines Builds als nicht stabil mit einem groovigen Post-Build-Plugin

if(manager.logContains("Could not login to FTP server")) {
    manager.addWarningBadge("FTP Login Failure")
    manager.createSummary("warning.gif").appendText("<h1>Failed to login to remote FTP Server!</h1>", false, false, false, "red")
    manager.buildUnstable()
}

Siehe auch Groovy Postbuild Plugin

8
Kalpesh Soni

Ich habe in meinem Jobskript folgende Anweisungen (dieser Job läuft nur auf dem Jenkins-Master):

# This is the condition test I use to set the build status as UNSTABLE
if [ ${PERCENTAGE} -gt 80 -a ${PERCENTAGE} -lt 90 ]; then
  echo WARNING: disc usage percentage above 80%

  # Download the Jenkins CLI JAR:
  curl -o jenkins-cli.jar ${JENKINS_URL}/jnlpJars/jenkins-cli.jar

  # Set build status to unstable
  Java -jar jenkins-cli.jar -s ${JENKINS_URL}/ set-build-result unstable

fi

Diese und weitere Informationen zum Setzen von Build-Status finden Sie im Jenkins-Wiki: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

6
Steve HHH
  1. Konfigurieren Sie PHP build, um einen XML-Junit-Bericht zu erstellen

    <phpunit bootstrap="tests/bootstrap.php" colors="true" >
       <logging>
           <log type="junit" target="build/junit.xml" 
               logIncompleteSkipped="false" title="Test Results"/>
       </logging>
    
       ....
    
     </phpunit>
    
  2. Beenden Sie das Build-Skript mit Status 0

    ...
    exit 0;
    
  3. Postbuild-Aktion hinzufügen JUnit-Testergebnisbericht veröffentlichen für XML-Testbericht. Dieses Plugin ändert den Stabilen Build in Unstable, wenn der Test fehlschlägt. 

    **/build/junit.xml
    
  4. Fügen Sie Jenkins Text Finder plugin mit Scans der Konsolenausgabe und ungeprüften Optionen hinzu. Dieses Plugin kann aufgrund schwerwiegender Fehler nicht vollständig aufgebaut werden.

    PHP Fatal error:
    
4
MariuszS

Der flexibelste Weg dazu ist das Lesen einer Datei im groovigen Post-Build-Plugin .  enter image description here

import hudson.FilePath
import Java.io.InputStream

def build = Thread.currentThread().executable

String unstable = null
if(build.workspace.isRemote()) {
    channel = build.workspace.channel;
    fp = new FilePath(channel, build.workspace.toString() + "/build.properties")
    InputStream is = fp.read()
    unstable = is.text.trim()
} else {
    fp = new FilePath(new File(build.workspace.toString() + "/build.properties"))
    InputStream is = fp.read()
    unstable = is.text.trim()
}

manager.listener.logger.println("Build status file: " + unstable)
if (unstable.equalsIgnoreCase('true')) {
    manager.listener.logger.println('setting build to unstable')
    manager.buildUnstable()
}

Wenn der Inhalt der Datei 'true' ist, wird der Build auf instabil gesetzt. Dies funktioniert auf dem lokalen Master und auf allen Slaves, auf denen Sie den Job ausführen, und für alle Arten von Skripts, die auf die Festplatte schreiben können.

3
jeremyjjbrown

Der TextFinder ist nur dann gut, wenn der Jobstatus nicht von ERFOLG in FAILED oder ABORTED geändert wurde. Verwenden Sie in solchen Fällen ein grooviges Skript im PostBuild-Schritt:

errpattern = ~/TEXT-TO-LOOK-FOR-IN-JENKINS-BUILD-OUTPUT.*/;
manager.build.logFile.eachLine{ line ->
    errmatcher=errpattern.matcher(line)
    if (errmatcher.find()) {
        [email protected] = hudson.model.Result.NEW-STATUS-TO-SET
    }
 }

Weitere Details finden Sie in einem Beitrag, den ich darüber geschrieben habe: http://www.tikalk.com/devops/JenkinsJobStatusChange/

1
yorammi

Als einfachere Alternative zu den vorhandenen Antworten können Sie das Build-Ergebnis mit einem einfachen HTTP POST festlegen, um auf die Groovy-Skriptkonsole REST - API zuzugreifen :

    curl -X POST \
     --silent \
     --user "$YOUR_CREDENTIALS" \
     --data-urlencode "script=Jenkins.instance.getItemByFullName( '$JOB_NAME' ).getBuildByNumber( $BUILD_NUMBER ).setResult( hudson.model.Result.UNSTABLE )" $JENKINS_URL/scriptText

Vorteile:

  • sie müssen keine riesige JAR-Datei herunterladen und ausführen
  • keine Fehler beim Setzen und Lesen eines globalen Status (Konsolentext, Dateien im Arbeitsbereich)
  • keine Plugins erforderlich (außer Groovy)
  • es ist nicht notwendig, einen zusätzlichen Build-Schritt zu konfigurieren, der in den Fällen PASSED oder FAILURE überflüssig ist.

Für diese Lösung muss Ihre Umgebung die folgenden Bedingungen erfüllen:

  • Auf die Jenkins REST API kann vom Slave aus zugegriffen werden
  • Der Slave muss Zugriff auf Anmeldeinformationen haben, die den Zugriff auf die API REST des Jenkins Groovy-Skripts ermöglichen.
1
Alex O

Ich dachte, ich würde eine weitere Antwort für Leute posten, die nach etwas Ähnlichem suchen könnten.

In unserem Build-Job haben wir Fälle, in denen wir möchten, dass der Build fortgesetzt wird, aber als instabil markiert werden. Bei uns handelt es sich um Versionsnummern.

Ich wollte also eine Bedingung für den Build festlegen und den Build auf instabil setzen, wenn diese Bedingung erfüllt ist.

Ich habe die Option Conditional step (single) als Build-Schritt verwendet.

Dann habe ich Execute System Groovy Script als Erstellungsschritt verwendet, der ausgeführt werden würde, wenn diese Bedingung erfüllt ist.

Ich habe Groovy Command verwendet und das Skript folgendermaßen eingestellt

import hudson.model.*

def build = Thread.currentThread().executable
[email protected] = hudson.model.Result.UNSTABLE

return

Das scheint ganz gut zu funktionieren.

Ich bin über die Lösung hier gestolpert

http://tech.akom.net/archives/112-Marking-Jenkins-build-UNSTABLE-von-environment-inject-groovy-script.html

1
adprocas

Wenn Shell mit einem fehlgeschlagenen Befehl aufgehört hat, ist alles OK (Build fehlgeschlagen:).

 if [ "$?" -ne 0 ]; then
    exit 1
 fi 

Korrektur von @zrajm: es könnte vereinfacht werden

... || exit 1
0
GKislin

Dupliziere meine Antwort von hier weil ich einige Zeit damit verbracht habe, das zu finden:

Dies ist jetzt in neueren Versionen von Jenkins möglich. Sie können etwa Folgendes tun:

#!/usr/bin/env groovy

properties([
  parameters([string(name: 'foo', defaultValue: 'bar', description: 'Fails job if not bar (unstable if bar)')]),
])


stage('Stage 1') {
  node('parent'){
    def ret = sh(
      returnStatus: true, // This is the key bit!
      script: '''if [ "$foo" = bar ]; then exit 2; else exit 1; fi'''
    )
    // ret can be any number/range, does not have to be 2.
    if (ret == 2) {
      currentBuild.result = 'UNSTABLE'
    } else if (ret != 0) {
      currentBuild.result = 'FAILURE'
      // If you do not manually error the status will be set to "failed", but the
      // pipeline will still run the next stage.
      error("Stage 1 failed with exit code ${ret}")
    }
  }
}

Der Pipeline-Syntax-Generator zeigt Ihnen dies auf der erweiterten Registerkarte:

 Pipeline Syntax Example

0
gib