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.
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.
Antworten:
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)
Ü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
result\":null
0 zurück.result\":null
den 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!
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!
Ein ehemaliger Kollege von mir hat https://github.com/txels/autojenkins geschrieben, das eine ganze Reihe von praktischen Funktionen und API-ähnlichen Dingen enthält, um mit einer Jenkins-Instanz von Python zu arbeiten ...
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()
Sie können ein Groovy-Skript verwenden:
Ü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>
.
echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
| ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
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 -s
oder -f
am 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 -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.
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-job
es tun, was Sie wollen, gibt es tatsächlich nicht das Ergebnis zurück - es gibt nur die Auftragskonfiguration zurück.
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!!"
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