Come posso controllare lo stato della build Jenkins senza passare al browser?
Se necessario, posso creare uno script usando l'API JSON, ma mi chiedevo se c'è già qualcosa di simile incorporato.
Come posso controllare lo stato della build Jenkins senza passare al browser?
Se necessario, posso creare uno script usando l'API JSON, ma mi chiedevo se c'è già qualcosa di simile incorporato.
Risposte:
Non sono riuscito a trovare uno strumento integrato, quindi ne ho creato uno:
#!/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)
Controlla se una build è in esecuzione o meno
Ho provato lo script Python nella risposta a questa domanda, ma non sono riuscito a farlo funzionare. Non conosco Python e non volevo investire tempo nel debug, ma sono stato in grado di leggere abbastanza della sceneggiatura per trarne ispirazione.
Tutto quello che devo fare è verificare se una build è in esecuzione o meno. Per fare ciò ho usato curl e grep, in questo modo:
curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null
result\":null
restituirà 0.result\":null
restituirà 1.Non particolarmente elegante, ma funziona abbastanza bene per le mie esigenze.
Ad esempio, ho uno script Bash che avvia una compilazione, quindi attende che finisca:
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
Grazie per l'ispirazione, Catskul!
TypeError: cannot concatenate 'str' and 'NoneType' objects
. Non conosco Python, quindi sono passato all'utilizzo di shell e ho fatto +1 sulla tua risposta per l'ispirazione. Grazie!
Un mio ex collega ha scritto https://github.com/txels/autojenkins che ha un sacco di funzioni utili e cose di tipo API in giro lavorando con un'istanza Jenkins di Python ...
Un'altra soluzione Python:
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()
Puoi usare uno script Groovy:
Via jenkins-cli
echo 'println(jenkins.model.Jenkins.instance'\
'.getItem("<JOB-NAME>").lastBuild.building)' \
| java -jar jenkins-cli.jar -s <JENKINS-URL> groovy =
, dove =
significa standard in. Puoi autenticarti con --username <USER> --password <PASS>
o con-i <SSH-PRIVATE-KEY>
.
echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
| ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
Penso di aver trovato un modo più semplice. Se ho capito bene, vuoi controllare il risultato della build - se è stato un successo o un fallimento, in altre parole.
Il comando "build" della CLI di Jenkins modifica il codice di uscita in base al risultato della build, purché si usi il -s
o-f
opzione alla fine.
Per esempio,
java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -s
o
java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -f
Si noti che l'opzione va alla fine; non è il primo-s
, utilizzato per definire l'URL dell'istanza di Jenkins.
E quindi, per ottenere il risultato, è possibile utilizzare $?
:
echo $?
Se il risultato è 0, è stato un successo. Se è qualcosa di diverso da 0, è stato un errore.
Riferimento: Non riesco a trovare un'istanza pubblica Jenkins che dà accesso a questa pagina, ma può essere trovato nel vostro esempio Jenkins locali: http://<url of Jenkins Instance>/cli/command/build
. Spiega anche la differenza tra -s
e -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.
Fortunatamente, esiste un jenkins-cli che è possibile utilizzare per ottenere alcune informazioni da Jenkins. Sfortunatamente, non è possibile recuperare lo stato di una build utilizzando l'interfaccia della riga di comando, il che significa che la soluzione dell'utilizzo dell'API JSON non è solo corretta, ma è l'unico modo programmatico di farlo.
Inoltre, sebbene get-job
possa fare ciò che desideri, in realtà non restituisce il risultato, ma restituisce solo la configurazione del lavoro.
Un altro script per 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!!"
Puoi provare con questo,
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