web-dev-qa-db-fra.com

Comment puis-je vérifier l'état de génération d'une génération Jenkins à partir de la ligne de commande?

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 y avait déjà quelque chose comme ça intégré.

43
Catskul

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

Vérifiez si une build 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 pu le faire fonctionner. Je ne connais pas Python, et je ne voulais pas investir de temps dans le débogage, mais a pu lire suffisamment de scénario pour s'en inspirer.

Tout ce que je dois 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\":null renverra 0.
  • Si une construction est terminée, un grep pour result\":null renverra 1.

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

Par exemple, j'ai un script Bash qui démarre une build, puis attend qu'il 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!

12
Steve HHH

Un ancien collègue à moi a écrit https://github.com/txels/autojenkins qui a tout un tas de fonctionnalités pratiques et de trucs de type API autour du travail avec une instance Jenkins de Python ...

6
Tom O'Connor

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

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 in. 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
    
4
tworec

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

La commande "build" de Jenkins CLI change le code de sortie en fonction du résultat de la construction, tant que vous utilisez le -s ou -f option à 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 disparaît à la fin; ce n'est pas le premier -s, qui est utilisé 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, ce fut un succès. Si c'est autre chose que 0, ce fut un échec.

Référence: je ne trouve pas d'instance Jenkins publique donnant accès à cette page, mais elle se trouve dans votre instance Jenkins locale: http://<url of Jenkins Instance>/cli/command/build. Il explique également la différence entre -s et -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.
3
SuperGT

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!!"
2
Roberto Ramos

Heureusement, il existe un jenkins-cli que vous pouvez utiliser pour obtenir des informations de Jenkins. Malheureusement, vous ne pouvez pas récupérer l'état d'une génération à l'aide de la CLI - ce qui signifie que votre solution d'utilisation de l'API JSON n'est pas seulement correcte - c'est la seule façon programmatique de le faire.

De plus, même si cela ressemble à get-job peut faire ce que vous voulez, il ne retourne pas réellement le résultat - il ne renvoie que la configuration du travail.

2
Andrew M.

Vous pouvez utiliser le descripteur symbolique lastBuild:

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

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

2
joniale

Vous pouvez 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
0
lakshmikandan