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.

Catskul
źródło
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)
Catskul
źródło
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!

Steve HHH
źródło
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()
ddtraveller
źródło
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
tworec
źródło
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.
SuperGT
źródło
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.

joniale
źródło
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.

Andrew M.
źródło
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!!"
Roberto Ramos
źródło
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
lakshmikandan
źródło