Jak sprawdzić status kompilacji kompilacji Jenkins z wiersza poleceń?


40

Jak sprawdzić stan kompilacji Jenkins bez przełączania się do przeglądarki?

W razie potrzeby mogę utworzyć skrypt za pomocą interfejsu API JSON, ale zastanawiałem się, czy jest już coś takiego wbudowanego.


Możesz także użyć specjalistycznych narzędzi, takich jak CatLight Build Monitor , które wyświetlą status kompilacji w zasobniku.
— alex

Każdy post tutaj wskazuje na „ostatnią kompilację”. Czy istnieje podobne zapytanie o sprawdzenie statusu zadania / kompilacji o numerze X? Coś, co sprawdzasz w czasie rzeczywistym lub po fakcie.
— David

Odpowiedzi:


38

Nie mogłem znaleźć wbudowanego narzędzia, więc zrobiłem jedno:

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

W jaki sposób jesteś uwierzytelnionym użytkownikiem Jenkins w swoim skrypcie?
— Aman Varshney

11

Sprawdź, czy kompilacja działa, czy nie

Wypróbowałem skrypt Python w odpowiedzi na to pytanie, ale nie mogłem go uruchomić. Nie znam Pythona i nie chciałem inwestować czasu w debugowanie, ale byłem w stanie przeczytać wystarczająco dużo skryptu, aby czerpać z niego inspirację.

Wszystko, co muszę zrobić, to sprawdzić, czy kompilacja działa. Aby to zrobić, użyłem curl i grep, jak poniżej:

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

  • Jeśli trwa budowanie, grep dla result\":nullzwróci 0.
  • Po zakończeniu kompilacji grep result\":nullzwróci 1.

Niezbyt elegancki, ale działa wystarczająco dobrze dla moich potrzeb.

Na przykład mam skrypt Bash, który rozpoczyna kompilację, a następnie czeka na zakończenie:

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

Dzięki za inspirację, Catskul!


Poszedłem i sprawdziłem moją obecną implementację, która działa, i jest nieco inna niż wersja, którą podałem w odpowiedzi z powodu niektórych wymagań dotyczących hasła. Czy wiesz, dlaczego to nie działało dla ciebie?
— Catskul

Python skrypt działa świetnie, jeśli zadanie zostało już zakończone, ale jeśli praca jest uruchomiony, Python skrypt kończy się niepowodzeniem: TypeError: cannot concatenate 'str' and 'NoneType' objects. Nie znam Pythona, więc przerzuciłem się na używanie powłoki i dałem +1 twojej odpowiedzi za inspirację. Dzięki!
— Steve HHH,

Możesz dodać || a następnie warunek dla kodu wyjścia 1, curl --silent $ JOB_STATUS_URL | wynik grep \ ": null> / dev / null || if [" $? "==" 1 "]; następnie GREP_RETURN_CODE = $? Więc nie otrzymujesz kodu wyjścia '1' w przypadku, gdy działasz w kompilacji Jenkinsa i nie chcesz, żeby zawiódł
— Shachar Hamuzim Rajuan


4

Inne rozwiązanie 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

Możesz użyć skryptu 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 =

    , gdzie =oznacza standardowe wejście. Możesz uwierzytelnić się za pomocą --username <USER> --password <PASS>lub za pomocą -i <SSH-PRIVATE-KEY>.

  2. Przez jenkins-cli przez SSH

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

3

Myślę, że znalazłem łatwiejszy sposób. Jeśli dobrze zrozumiałem, chcesz sprawdzić wynik kompilacji - innymi słowy, jeśli był to sukces lub porażka.

Polecenie „build” Jenkins CLI zmienia kod wyjścia w zależności od wyniku kompilacji, o ile na końcu używasz opcji -slub -f.

Na przykład,

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -s

lub

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -f

Zauważ, że opcja idzie na końcu; nie jest to pierwszy -s, który służy do definiowania adresu URL instancji Jenkins.

A następnie, aby uzyskać wynik, możesz użyć $?:

echo $?

Jeśli wynik wynosi 0, był to sukces. Jeśli jest to coś innego niż 0, to była awaria.

Referencje: Nie mogę znaleźć publiczne wystąpienie Jenkins, który daje dostęp do tej strony, ale można je znaleźć w lokalnej instancji Jenkins: http://<url of Jenkins Instance>/cli/command/build. To również wyjaśnia różnicę między -si -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

Możesz użyć symbolicznego deskryptora lastBuild:

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

resultElement odpowiedzi zawiera ciąg opisujący wynik kompilacji.


2

Na szczęście istnieje jenkins-cli , za pomocą którego można uzyskać informacje od Jenkinsa. Niestety nie można odzyskać statusu kompilacji za pomocą interfejsu CLI - co oznacza, że ​​rozwiązanie polegające na użyciu interfejsu API JSON jest nie tylko poprawne - jest to jedyny programowy sposób.

Ponadto, chociaż wygląda na to, że get-jobmoże zrobić to, co chcesz, w rzeczywistości nie zwraca wyniku - zwraca jedynie konfigurację zadania.


2

Kolejny skrypt dla 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!!"

Dzięki. Okazało się to bardzo pomocne.
— Victor S

0

Możesz spróbować z tym

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.