Как проверить статус сборки сборки Jenkins из командной строки?


40

Как проверить статус сборки Jenkins без переключения в браузер?

При необходимости я могу создать сценарий с помощью JSON API, но мне было интересно, есть ли уже что-то подобное встроенное.


Вы также можете использовать специализированные инструменты, такие как CatLight Build Monitor, которые будут отображать состояние сборки в трее.
Алекс

Кажется, что каждый пост указывает на «последнюю сборку». Существует ли аналогичный запрос для проверки статуса задания / номера сборки X? Что-то вы проверяете в реальном времени или по факту.
Дэвид

Ответы:


38

Я не мог найти встроенный инструмент, поэтому я сделал один:

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

Как вы проходите аутентификацию пользователя Jenkins в вашем скрипте?
Аман Варшней

11

Проверьте, работает ли сборка или нет

Я попробовал скрипт Python в ответе на этот вопрос, но не смог заставить его работать. Я не знаю Python и не хотел тратить время на отладку, но смог прочитать достаточно сценария, чтобы получить от него вдохновение.

Все, что мне нужно сделать, это проверить, запущена ли сборка или нет. Для этого я использовал curl и grep, вот так:

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

  • Если сборка выполняется, grep for result\":nullвернет 0.
  • Если сборка завершена, grep для 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

Спасибо за вдохновение, Catskul!


Я пошел и проверил мою текущую реализацию, которая работает, и она немного отличается от версии, которую я вставил в ответ из-за некоторых требований к паролю. Вы знаете, почему это не работает для вас?
Catskul

Python скрипт отлично работает , если работа уже закончена, но если задание выполняется, Python скрипт не: TypeError: cannot concatenate 'str' and 'NoneType' objects. Я не знаю Python, поэтому я переключился на использование оболочки и добавил ваш ответ для вдохновения. Благодарность!
Стив ХХХ

Вы можете добавить || и после этого условие для кода выхода 1, curl --silent $ JOB_STATUS_URL | grep result \ ": null> / dev / null || if [" $? "==" 1 "]; затем GREP_RETURN_CODE = $? Таким образом, вы не получите код выхода '1', если вы работаете в сборке Jenkins и ты не хочешь, чтобы это потерпело неудачу
Шахар Хамузим Раджуан


4

Другое решение 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

Вы можете использовать Groovy скрипт:

  1. Виа Дженкинс-Кли

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

  2. Виа Дженкинс-Кли через SSH

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

3

Я думаю, что нашел более простой способ. Если я правильно понял, вы хотите проверить результат сборки - другими словами, был ли он успешным или неудачным.

Команда Jenkins CLI изменяет код выхода в зависимости от результата сборки, если в конце используется опция -sor -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, это был сбой.

Ссылка: Я не могу найти экземпляр общественного Дженкинс , который дает доступ к этой странице, но его можно найти в вашем локальном экземпляре Дженкинс: 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.

2

Вы можете использовать символический дескриптор lastBuild:

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

resultЭлемент в ответ содержит строку , описывающую исход сборки.


2

К счастью, есть jenkins-cli, который вы можете использовать для получения информации от Jenkins. К сожалению, вы не можете получить статус сборки, используя CLI - это означает, что ваше решение использовать JSON API не только правильно - это единственный программный способ сделать это.

Кроме того, хотя он выглядит так, как будто он get-jobможет делать то, что вы хотите, он на самом деле не возвращает результат - он только возвращает конфигурацию задания.


2

Еще один скрипт для 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!!"

Спасибо. Это оказалось очень полезным.
Виктор С

0

Вы можете попробовать с этим,

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.