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

Catskul
fuente
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)
Catskul
fuente
¿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!

Steve HHH
fuente
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
6

Un ex colega mío escribió https://github.com/txels/autojenkins que tiene un montón de características de conveniencia y cosas de tipo API para trabajar con una instancia de Jenkins de Python ...

Tom O'Connor
fuente
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()
ddtraveller
fuente
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
tworec
fuente
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.
SuperGT
fuente
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.

joniale
fuente
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.

Andrew M.
fuente
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!!"
Roberto Ramos
fuente
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
lakshmikandan
fuente