Come posso controllare lo stato di compilazione di una build Jenkins dalla riga di comando?


40

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.


Puoi anche utilizzare strumenti specializzati come CatLight Build Monitor che mostreranno lo stato della build nel vassoio.
alex

Ogni post qui sembra indicare "ultima build". Esiste una query simile per verificare lo stato del lavoro / numero build X? Qualcosa che stai controllando in tempo reale o dopo il fatto.
David

Risposte:


38

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)

Come sei autenticato utente Jenkins nella tua sceneggiatura?
Aman Varshney,

11

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

  • Se è in corso un build, un grep per result\":nullrestituirà 0.
  • Se una build è terminata, un grep per result\":nullrestituirà 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!


Sono andato a controllare la mia attuale implementazione che funziona, ed è un po 'diversa dalla versione che ho inserito nella risposta a causa di alcuni requisiti di password. Sai perché non ha funzionato per te?
Catskul,

Lo script Python funziona alla grande, se un lavoro è già finito, ma se un processo è in esecuzione, lo script Python fallisce: 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!
Steve HHH,

Puoi aggiungere || e successivamente la condizione per il codice di uscita 1, arricciare --silent $ JOB_STATUS_URL | risultato grep \ ": null> / dev / null || if [" $? "==" 1 "]; quindi GREP_RETURN_CODE = $? Quindi non ottieni il codice di uscita '1' nel caso in cui esegui Jenkins build e non vuoi che fallisca.
Shachar Hamuzim Rajuan,


4

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

4

Puoi usare uno script Groovy:

  1. 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> .

  2. Via jenkins-cli su SSH

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

3

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 -so-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 -se -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.

2

Puoi usare il descrittore simbolico lastBuild:

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

L' resultelemento nella risposta contiene una stringa che descrive il risultato della build.


2

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-jobpossa fare ciò che desideri, in realtà non restituisce il risultato, ma restituisce solo la configurazione del lavoro.


2

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!!"

Grazie. Questo si è rivelato molto utile.
Victor S

0

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.