Как мне проверить статус сборки Jenkins, не переключаясь в браузер?
При необходимости я могу создать сценарий, используя JSON API, но мне было интересно, есть ли уже что-то подобное встроенному.
Я не смог найти встроенный инструмент, поэтому сделал его:
#!/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)
Проверьте, запущена ли сборка или нет
Я попробовал сценарий Python в ответе на этот вопрос, но не смог заставить его работать. Я не знаю Python и не хотел тратить время на отладку, но смог прочитать достаточно скрипта, чтобы почерпнуть из него вдохновение.
Все, что мне нужно сделать, это проверить, запущена ли сборка или нет. Для этого я использовал curl и grep, например:
curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null
result\":null
вернет 0.result\":null
вернет 1.Не особо изящно, но вполне подходит для моих нужд.
Например, у меня есть сценарий Bash, который запускает сборку, а затем ждет ее завершения:
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
Спасибо за вдохновение, Катскул!
Мой бывший коллега написал https://github.com/txels/autojenkins который имеет целый набор удобных функций и типов API для работы с экземпляром Jenkins из Python ...
Другое решение 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()
Вы можете использовать сценарий Groovy:
Через Дженкинс-Кли
echo 'println(jenkins.model.Jenkins.instance'\
'.getItem("<JOB-NAME>").lastBuild.building)' \
| java -jar jenkins-cli.jar -s <JENKINS-URL> groovy =
, где =
означает стандартный вход. Вы можете аутентифицироваться с помощью --username <USER> --password <PASS>
или с -i <SSH-PRIVATE-KEY>
.
Через jenkins-cli через SSH
echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
| ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
Я думаю, что нашел более простой способ. Если я правильно понял, вы хотите проверить результат сборки - другими словами, был ли он успешным или неудачным.
Команда Jenkins CLI "build" изменяет код выхода в зависимости от результата сборки, если вы используете -s
или -f
вариант в конце.
Например,
java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -s
или
java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -f
Обратите внимание, что опция идет в конце; это не первый -s
, который используется для определения URL-адреса экземпляра Jenkins.
А потом, чтобы получить результат, можно использовать $?
:
echo $?
Если результат равен 0, это было успехом. Если это что-то другое, кроме 0, это был сбой.
Ссылка: я не могу найти общедоступный экземпляр Jenkins, который предоставляет доступ к этой странице, но его можно найти в вашем локальном экземпляре Jenkins: http://<url of Jenkins Instance>/cli/command/build
. Это также объясняет разницу между -s
и -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.
Вы можете использовать символический дескриптор lastBuild
:
http://localhost/jenkins/job/<jobName>/lastBuild/api/xml
В result
Элемент в ответе содержит строку, описывающую результат сборки.
К счастью, есть Дженкинс-Кли которую вы можете использовать для получения информации от Дженкинса. К сожалению, вы не можете получить статус сборки с помощью интерфейса командной строки - это означает, что ваше решение с использованием JSON API не только правильно - это единственный программный способ сделать это.
Кроме того, пока это выглядит как get-job
может делать то, что вы хотите, на самом деле он не возвращает результат - он возвращает только конфигурацию задания.
Другой скрипт для 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!!"
Вы можете попробовать с этим,
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