¿Cómo verifico el estado de compilación de una compilación de Jenkins desde la línea de comandos?


40

¿Cómo verifico el estado de compilación de Jenkins sin cambiar al navegador?

Si es necesario, puedo crear un script usando la API JSON, pero me preguntaba si ya hay algo como esto incorporado.


También puede usar herramientas especializadas como CatLight Build Monitor que mostrarán el estado de compilación en la bandeja.
alex

Cada publicación aquí parece apuntar a la "última compilación". ¿Hay una consulta similar para verificar el estado del trabajo / número de compilación X? Algo que estás comprobando en tiempo real o después del hecho.
David

Respuestas:


38

No pude encontrar una herramienta integrada, así que hice una:

#!/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)

¿Cómo se autentica el usuario de Jenkins en su script?
Aman Varshney

11

Verifique si una compilación se está ejecutando o no

Intenté el script de Python en la respuesta a esta pregunta, pero no pude hacerlo funcionar. No conozco Python, y no quería invertir tiempo en la depuración, pero pude leer lo suficiente del script para inspirarme.

Todo lo que necesito hacer es verificar si una compilación se está ejecutando o no. Para hacer eso usé curl y grep, así:

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

  • Si una compilación está en progreso, un grep para result\":nulldevolverá 0.
  • Si finaliza una construcción, un grep for result\":nulldevolverá 1.

No es especialmente elegante, pero funciona lo suficientemente bien para mis necesidades.

Por ejemplo, tengo un script Bash que comienza una compilación, luego espera a que 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

Gracias por la inspiración, Catskul!


Fui y verifiqué mi implementación actual, que funciona, y es un poco diferente a la versión que puse en la respuesta debido a algunos requisitos de contraseña. ¿Sabes por qué no te funcionaba?
Catskul

La secuencia de comandos de Python funciona muy bien si un trabajo ya ha terminado, pero si está ejecutando una tarea, la secuencia de comandos de Python falla: TypeError: cannot concatenate 'str' and 'NoneType' objects. No conozco Python, así que cambié a usar shell y hice +1 en tu respuesta para inspirarte. ¡Gracias!
Steve HHH

Puedes agregar || y después de eso la condición para el código de salida 1, curl --silent $ JOB_STATUS_URL | resultado grep \ ": null> / dev / null || if [" $? "==" 1 "]; luego GREP_RETURN_CODE = $? Entonces no obtiene el código de salida '1' en caso de que esté ejecutando la compilación Jenkins y no quieres que falle.
Shachar Hamuzim Rajuan


4

Otra solución de 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

Puedes usar 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 =

    , donde =significa entrada estándar. Puede autenticarse con --username <USER> --password <PASS>o con -i <SSH-PRIVATE-KEY>.

  2. Via jenkins-cli sobre SSH

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

3

Creo que encontré una manera más fácil. Si entendí correctamente, desea verificar el resultado de la compilación, en otras palabras, si fue un éxito o un fracaso.

El comando "compilar" de Jenkins CLI cambia el código de salida según el resultado de la compilación, siempre que use la opción -so -fal final.

Por ejemplo,

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

Tenga en cuenta que la opción va al final; no es el primero -s, que se usa para definir la URL de la instancia de Jenkins.

Y luego, para obtener el resultado, puede usar $?:

echo $?

Si el resultado es 0, fue un éxito. Si es algo diferente a 0, fue un fracaso.

Referencia: No puedo encontrar un ejemplo Jenkins pública que da acceso a esta página, pero puede ser encontrado en su instancia local Jenkins: http://<url of Jenkins Instance>/cli/command/build. También explica la diferencia entre -sy -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

Puedes usar el descriptor simbólico lastBuild:

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

El resultelemento en la respuesta contiene una cadena que describe el resultado de la compilación.


2

Afortunadamente, hay un jenkins-cli que puedes usar para obtener información de Jenkins. Desafortunadamente, no puede recuperar el estado de una compilación usando la CLI, lo que significa que su solución de usar la API JSON no solo es correcta, sino que es la única forma programática de hacerlo.

Además, aunque parece que get-jobpodría hacer lo que desea, en realidad no devuelve el resultado, solo devuelve la configuración del trabajo.


2

Otro script para 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!!"

Gracias. Esto resultó ser muy útil.
Victor S

0

Puedes intentar con esto,

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.