54 votes

Comment vérifier l'état d'une construction Jenkins à partir de la ligne de commande ?

Comment vérifier l'état de la construction Jenkins sans passer par le navigateur ?

Si nécessaire, je peux créer un script en utilisant l'API JSON, mais je me demandais s'il existait déjà quelque chose de ce type intégré.

46voto

Shayna Points 1

Je n'ai pas trouvé d'outil intégré, j'en ai donc fabriqué 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)

21voto

MemphiZ Points 369

Vérifier si une construction est en cours ou non

J'ai essayé le script Python script dans la réponse à cette question, mais je n'ai pas réussi à le faire fonctionner. Je ne connais pas Python, et je n'ai pas voulu investir de temps dans le débogage, mais j'ai pu lire suffisamment de script pour m'en inspirer.

Tout ce que j'ai besoin de faire, c'est de vérifier si une construction est en cours 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 for result\":null renvoie 0.
  • Si la construction est terminée, un grep for result\":null renvoie la valeur 1.

Ce n'est pas particulièrement élégant, mais cela fonctionne suffisamment bien pour mes besoins.

Par exemple, j'ai un script Bash qui démarre une construction, puis attend qu'elle se termine :

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 !

6voto

Pablo Venturino Points 1660

Un de mes anciens collègues a écrit https://github.com/txels/autojenkins qui propose tout un tas de fonctionnalités et d'API pour travailler avec une instance Jenkins depuis Python...

6voto

SuperGT Points 41

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

La commande "build" de l'interface de programmation de Jenkins modifie le code de sortie en fonction du résultat de la construction, à condition que vous utilisiez l'option -s o -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

Remarquez que l'option se trouve à la fin ; ce n'est pas la première -s qui sert à définir l'URL de l'instance Jenkins.

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

echo $?

Si le résultat est 0, c'est un succès. Si le résultat est différent de 0, c'est un échec.

Référence : Je n'ai pas trouvé d'instance Jenkins publique qui donne accès à cette page, mais elle peut être trouvée dans votre instance Jenkins locale : http://<url of Jenkins Instance>/cli/command/build . Il explique également la différence entre -s y -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.

6voto

ddtraveller Points 161

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X