Wie überprüfe ich den Build-Status eines Jenkins-Builds über die Befehlszeile?

40

Wie überprüfe ich den Jenkins-Build-Status, ohne zum Browser zu wechseln?

Bei Bedarf kann ich mithilfe der JSON-API ein Skript erstellen. Ich habe mich jedoch gefragt, ob bereits so etwas eingebaut ist.

Catskul
quelle
Sie können auch spezielle Tools wie CatLight Build Monitor verwenden , die den Build-Status in der Taskleiste anzeigen .
Alex
Jeder Beitrag hier scheint auf "last build" zu verweisen. Gibt es eine ähnliche Abfrage zum Überprüfen des Status von Job / Build-Nummer X? Etwas, das Sie in Echtzeit oder nachträglich überprüfen.
David

Antworten:

38

Ich konnte kein eingebautes Werkzeug finden und habe eines erstellt:

#!/usr/bin/python
#
# author: ajs
# license: bsd
# copyright: re2


import json 
import sys
import urllib
import urllib2

jenkinsUrl = "https://jenkins.example.com/job/"


if len( sys.argv ) > 1 :
    jobName = sys.argv[1]
    jobNameURL = urllib.quote(jobName)
else :
    sys.exit(1)

try:
    jenkinsStream   = urllib2.urlopen( jenkinsUrl + jobNameURL + "/lastBuild/api/json" )
except urllib2.HTTPError, e:
    print "URL Error: " + str(e.code) 
    print "      (job name [" + jobName + "] probably wrong)"
    sys.exit(2)

try:
    buildStatusJson = json.load( jenkinsStream )
except:
    print "Failed to parse json"
    sys.exit(3)

if buildStatusJson.has_key( "result" ):      
    print "[" + jobName + "] build status: " + buildStatusJson["result"]
    if buildStatusJson["result"] != "SUCCESS" :
        exit(4)
else:
    sys.exit(5)

sys.exit(0)
Catskul
quelle
Wie sind Sie authentifizierter Jenkins-Benutzer in Ihrem Skript?
Aman Varshney
11

Überprüfen Sie, ob ein Build ausgeführt wird oder nicht

Ich habe das Python-Skript in der Antwort auf diese Frage ausprobiert, konnte es aber nicht zum Laufen bringen. Ich kenne Python nicht und wollte keine Zeit in das Debuggen investieren, konnte aber genug von dem Skript lesen, um mich davon inspirieren zu lassen.

Ich muss nur überprüfen, ob ein Build ausgeführt wird oder nicht. Dazu habe ich Curl und Grep verwendet:

curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null

  • Wenn ein Build ausgeführt wird, gibt ein Grep für result\":null0 zurück.
  • Wenn ein Build abgeschlossen ist, gibt ein grep for result\":nullden Wert 1 zurück.

Nicht besonders elegant, aber es funktioniert gut genug für meine Bedürfnisse.

Ich habe zum Beispiel ein Bash-Skript, das einen Build startet und darauf wartet, dass dieser beendet wird:

JOB_URL=http://jenkins.local/job/stevehhhbuild
JOB_STATUS_URL=${JOB_URL}/lastBuild/api/json

GREP_RETURN_CODE=0

# Start the build
curl $JOB_URL/build?delay=0sec

# Poll every thirty seconds until the build is finished
while [ $GREP_RETURN_CODE -eq 0 ]
do
    sleep 30
    # Grep will return 0 while the build is running:
    curl --silent $JOB_STATUS_URL | grep result\":null > /dev/null
    GREP_RETURN_CODE=$?
done

echo Build finished

Danke für die Inspiration, Catskul!

Steve HHH
quelle
Ich habe meine aktuelle Implementierung überprüft, die funktioniert, und sie unterscheidet sich aufgrund einiger Kennwortanforderungen ein wenig von der Version, die ich in der Antwort angegeben habe. Weißt du, warum es bei dir nicht funktioniert hat?
Catskul
Der Python - Skript funktioniert großartig , wenn ein Auftrag bereits beendet hat, aber wenn ein Auftrag ausgeführt wird , schlägt der Python - Skript: TypeError: cannot concatenate 'str' and 'NoneType' objects. Ich kenne Python nicht, daher habe ich auf Shell umgestellt und Ihre Antwort als Inspiration eingegeben. Vielen Dank!
Steve HHH
Sie können || hinzufügen und danach die Bedingung für Exit-Code 1, curl --silent $ JOB_STATUS_URL | grep result \ ": null> / dev / null || if [" $? "==" 1 "]; then GREP_RETURN_CODE = $? Sie erhalten also nicht den Exit-Code '1', falls Sie in Jenkins Build laufen und Sie wollen nicht, dass es fehlschlägt.
Shachar Hamuzim Rajuan
4

Eine andere Python-Lösung:

from jenkinsapi.jenkins import Jenkins

jenkins_url = 'http://<server url>/'
server = Jenkins(jenkins_url, username = 'myUser', password = myPass)

job_instance = server.get_job('the job name')
running = job_instance.is_queued_or_running()
if not running:
   latestBuild = job_instance.get_last_build()
   print latestBuild.get_status()
ddreisender
quelle
4

Sie können ein Groovy-Skript verwenden:

  1. Über Jenkins-Cli

    echo 'println(jenkins.model.Jenkins.instance'\
    '.getItem("<JOB-NAME>").lastBuild.building)' \
        | java -jar jenkins-cli.jar -s <JENKINS-URL> groovy =
    

    , wobei =Standard in bedeutet. Sie können sich mit --username <USER> --password <PASS>oder mit authentifizieren -i <SSH-PRIVATE-KEY>.

  2. Via Jenkins-Cli über SSH

    echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
    | ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
    
tworec
quelle
3

Ich denke, ich habe einen einfacheren Weg gefunden. Wenn ich es richtig verstanden habe, möchten Sie das Ergebnis des Builds überprüfen - mit anderen Worten, ob es ein Erfolg oder ein Misserfolg war.

Der Befehl "build" von Jenkins CLI ändert den Exit-Code abhängig vom Ergebnis des Builds, solange Sie die Option -soder -fam Ende verwenden.

Zum Beispiel,

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -s

oder

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -f

Beachten Sie, dass die Option am Ende steht. Es ist nicht die erste -s, mit der die URL der Jenkins-Instanz definiert wird.

Und um das Ergebnis zu erhalten, können Sie Folgendes verwenden $?:

echo $?

Wenn das Ergebnis 0 ist, war es ein Erfolg. Wenn es etwas anderes als 0 ist, war es ein Fehler.

Referenz: Ich kann nicht eine öffentliche Jenkins Instanz finden, die den Zugriff auf diese Seite gibt, aber es kann in Ihrem lokalen Jenkins Instanz zu finden: http://<url of Jenkins Instance>/cli/command/build. Es erklärt auch den Unterschied zwischen -sund -f:

-s  : Wait until the completion/abortion of the command. Interrupts are passed
      through to the build.

-f  : Follow the build progress. Like -s only interrupts are not passed
      through to the build.
Super GT
quelle
2

Sie können den symbolischen Deskriptor verwenden lastBuild:

http://localhost/jenkins/job/<jobName>/lastBuild/api/xml

Das resultElement in der Antwort enthält eine Zeichenfolge, die das Ergebnis des Builds beschreibt.

joniale
quelle
2

Glücklicherweise gibt es eine Jenkins-Cli , mit der Sie einige Informationen von Jenkins erhalten können. Leider können Sie den Status eines Builds nicht über die CLI abrufen. Dies bedeutet, dass Ihre Lösung für die Verwendung der JSON-API nicht nur korrekt ist, sondern auch die einzige programmgesteuerte Methode.

Auch wenn es so aussieht, als würde get-jobes tun, was Sie wollen, gibt es tatsächlich nicht das Ergebnis zurück - es gibt nur die Auftragskonfiguration zurück.

Andrew M.
quelle
2

Ein weiteres Skript für CMD (Windows):

:loop
ping 127.0.0.1 -n 6  1>nul
curl --silent http://localhost:8080/job/JOB_NAME/lastBuild/api/xml | FINDSTR "SUCCESS FAILURE" >nul & IF ERRORLEVEL 1 (goto :loop)
echo "BUILD FINISH!!"
Roberto Ramos
quelle
Vielen Dank. Dies hat sich als sehr hilfreich erwiesen.
Victor S
0

Sie können damit versuchen,

JOB_URL=http://localhost:8080/view/TestTab/job/JobWait
JOB_STATUS_URL=${JOB_URL}/lastBuild/api/json

GREP_RETURN_CODE=0

# Start the build
curl --user "username:password" $JOB_URL/build?delay=0sec

# Poll every 10 second  until the build is finished
while [ $GREP_RETURN_CODE -eq 0 ]
do
    sleep 10
    # Grep will return 0 while the build is running:
    curl --user "username:password" --silent $JOB_STATUS_URL | grep result\":null > /dev/null || if [ "$?" == "1" ]; then
      exit 0
    fi

    GREP_RETURN_CODE=$?
done
echo Build finished
Lakshmikandan
quelle