Comment vérifier le statut de génération d'une génération Jenkins à partir de la ligne de commande?

40

Comment puis-je vérifier l'état de la génération Jenkins sans passer au navigateur?

Si nécessaire, je peux créer un script à l'aide de l'API JSON, mais je me demandais s'il existait déjà quelque chose comme cela.

Catskul
la source
Vous pouvez également utiliser des outils spécialisés tels que CatLight Build Monitor, qui afficheront l’état de la construction dans la barre des tâches .
alex
Chaque message ici semble pointer vers "dernière construction". Existe-t-il une requête similaire pour vérifier le statut du travail / numéro de build X? Quelque chose que vous vérifiez en temps réel ou après coup.
David

Réponses:

38

Je ne pouvais pas trouver un outil intégré alors j'en ai créé un:

#!/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
la source
Comment vous êtes authentifié utilisateur Jenkins dans votre script?
Aman Varshney
11

Vérifiez si une version est en cours d'exécution ou non

J'ai essayé le script Python dans la réponse à cette question, mais je n'ai pas réussi à le faire fonctionner. Je ne connais pas Python et je ne voulais pas investir de temps dans le débogage, mais je pouvais lire suffisamment de script pour en tirer l'inspiration.

Tout ce que j'ai à faire est de vérifier si une version est en cours d'exécution ou non. Pour ce faire, j'ai utilisé curl et grep, comme ceci:

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

  • Si une construction est en cours, un grep pour result\":nullretournera 0.
  • Si une construction est terminée, un grep pour result\":nullretournera 1.

Pas particulièrement élégant, mais cela fonctionne assez bien pour mes besoins.

Par exemple, j'ai un script Bash qui commence une construction, puis attend sa fin:

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

Merci pour l'inspiration, Catskul!

Steve HHH
la source
Je suis allé vérifier mon implémentation actuelle qui fonctionne, et c'est un peu différent de la version que j'ai mise dans la réponse en raison de certaines exigences de mot de passe. Savez-vous pourquoi cela ne fonctionnait pas pour vous?
Catskul
Le script Python fonctionne bien si un travail est déjà terminé, mais si un travail est en cours d' exécution, l'échec d'un script Python: TypeError: cannot concatenate 'str' and 'NoneType' objects. Je ne connais pas Python, je me suis donc tourné vers shell et votre réponse pour l'inspiration. Merci!
Steve HHH
Vous pouvez ajouter || et ensuite la condition pour le code de sortie 1, curl --silent $ JOB_STATUS_URL | grep result \ ": null> / dev / null || if [" $? "==" 1 "]; alors GREP_RETURN_CODE = $? Donc, vous n'obtenez pas le code de sortie '1' dans le cas où vous exécutez la construction de Jenkins et vous ne voulez pas que cela échoue.
Shachar Hamuzim Rajuan
6

Un ancien de mes collègues a écrit https://github.com/txels/autojenkins qui propose de nombreuses fonctionnalités pratiques et des informations de type API permettant de travailler avec une instance Jenkins de Python ...

Tom O'Connor
la source
4

Une autre solution 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()
ddtraveller
la source
4

Vous pouvez utiliser un 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 =

    , où =signifie standard en. Vous pouvez vous authentifier avec --username <USER> --password <PASS>ou avec -i <SSH-PRIVATE-KEY>.

  2. Via jenkins-cli sur SSH

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

Je pense avoir trouvé un moyen plus facile. Si j'ai bien compris, vous voulez vérifier le résultat de la construction - si c'est un succès ou un échec, en d'autres termes.

La commande "build" de la CLI de Jenkins change le code de sortie en fonction du résultat de la construction, tant que vous utilisez l' option -sou -fà la fin.

Par exemple,

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

ou

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

Notez que l'option va à la fin; ce n'est pas le premier -sutilisé pour définir l'URL de l'instance Jenkins.

Et puis, pour obtenir le résultat, vous pouvez utiliser $?:

echo $?

Si le résultat est 0, c'était un succès. Si c'est autre chose que 0, c'est un échec.

Référence: Je ne peux pas trouver une instance publique Jenkins qui donne accès à cette page, mais il peut être trouvé dans votre instance locale Jenkins: http://<url of Jenkins Instance>/cli/command/build. Cela explique également la différence entre -set -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.
SuperGT
la source
2

Vous pouvez utiliser le descripteur symbolique lastBuild:

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

L' resultélément dans la réponse contient une chaîne décrivant le résultat de la construction.

Joniale
la source
2

Heureusement, il existe un jenkins-cli que vous pouvez utiliser pour obtenir des informations de Jenkins. Malheureusement, vous ne pouvez pas récupérer le statut d'une construction à l'aide de la CLI - ce qui signifie que votre solution d'utilisation de l'API JSON est non seulement correcte, mais constitue le seul moyen de le faire par programme.

De plus, même s'il semble get-jobpouvoir faire ce que vous voulez, il ne renvoie pas le résultat, il ne renvoie que la configuration du travail.

Andrew M.
la source
2

Un autre script pour 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
la source
Merci. Cela s'est avéré très utile.
Victor S
0

Tu peux essayer avec ça,

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
la source