it-swarm.com.de

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

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

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

43
Catskul

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)
39
Catskul

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

Ich habe das Skript Python 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, aber konnte genug von dem Drehbuch lesen, um sich davon inspirieren zu lassen.

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

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

  • Wenn ein Build ausgeführt wird, wird ein grep für result\":null gibt 0 zurück.
  • Wenn ein Build abgeschlossen ist, wird ein grep für result\":null gibt 1 zurück.

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

Zum Beispiel habe ich ein Bash-Skript, das einen Build startet und dann darauf wartet, dass er 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!

12
Steve HHH

Ein ehemaliger Kollege von mir schrieb https://github.com/txels/autojenkins , das eine ganze Reihe von praktischen Funktionen und API-Funktionen für die Arbeit mit einer Jenkins-Instanz aus Python bietet ...

6
Tom O'Connor

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()
5
ddtraveller

Sie können ein Groovy-Skript verwenden:

  1. Via 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 -i <SSH-PRIVATE-KEY> authentifizieren.

  2. Via Jenkins-Cli über SSH

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

Ich glaube, 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 am Ende die Option -s Oder -f 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 das erste -s, mit dem die URL der Jenkins-Instanz definiert wird.

Und um das Ergebnis zu erhalten, können Sie $? 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 keine öffentliche Jenkins-Instanz finden, die Zugriff auf diese Seite gewährt, aber sie befindet sich in Ihrer lokalen Jenkins-Instanz: http://<url of Jenkins Instance>/cli/command/build. Es erklärt auch den Unterschied zwischen -s Und -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.
3
SuperGT

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!!"
2
Roberto Ramos

Glücklicherweise gibt es ein jenkins-cli , mit dem 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 programmatische Methode.

Auch während es aussieht wie get-job kann tun, was Sie wollen, es gibt nicht das Ergebnis zurück - es gibt nur die Jobkonfiguration zurück.

2
Andrew M.

Sie können den symbolischen Deskriptor lastBuild verwenden:

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

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

2
joniale

Sie können es 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
0
lakshmikandan