¿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.
¿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.
Respuestas:
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)
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
result\":null
devolverá 0.result\":null
devolverá 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!
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!
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 ...
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()
Puedes usar un script Groovy:
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>
.
echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
| ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
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 -s
o -f
al 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 -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.
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-job
podría hacer lo que desea, en realidad no devuelve el resultado, solo devuelve la configuración del trabajo.
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!!"
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