Як я можу перевірити стан збірки конструкції Jenkins з командного рядка?


40

Як перевірити стан збірки Дженкінса без переходу на браузер?

Якщо потрібно, я можу створити сценарій за допомогою API JSON, але мені було цікаво, чи вже є щось подібне.


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

Кожен пост тут, здається, вказує на "останню збірку". Чи існує аналогічний запит на перевірку стану роботи / збірки номер 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 and grep, як це:

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

  • Якщо збірка триває, grep for 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

Дякую за натхнення, Кацкуле!


Я пішов і перевірив свою теперішню реалізацію, яка працює, і вона трохи відрізняється від версії, яку я поставив у відповідь через деякі вимоги до пароля. Чи знаєте ви, чому це не працювало для вас?
Catskul

Python скрипт відмінно працює , якщо робота вже закінчена, але якщо завдання виконується, Python скрипт ні: TypeError: cannot concatenate 'str' and 'NoneType' objects. Я не знаю Python, тому я перейшов на використання shell і поставив +1 для вашої відповіді. Дякую!
Стів HHH

Ви можете додати || і після цього умова для виходу коду 1, curl --silent $ JOB_STATUS_URL | grep результат \ ": null> / dev / null || якщо [" $? "==" 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. Через jenkins-cli

    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. Через jenkins-cli через SSH

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

3

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

Команда "build" Дженкінса CLI змінює вихідний код залежно від результату збірки, доки ви використовуєте -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-адреси екземпляра Дженкінса.

А потім, щоб отримати результат, ви можете використовувати $?:

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

На щастя, є джинсин-клі, який можна використовувати, щоб отримати деяку інформацію від Дженкінса. На жаль, ви не можете отримати статус збірки за допомогою CLI - це означає, що ваше рішення щодо використання API JSON не тільки правильне - це єдиний програмний спосіб зробити це.

Крім того, хоча це схоже на те, що 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!!"

Спасибі. Це виявилося дуже корисним.
Victor S

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.