Bagaimana cara memeriksa status build dari build Jenkins dari baris perintah?

40

Bagaimana cara memeriksa status build Jenkins tanpa beralih ke browser?

Jika diperlukan, saya dapat membuat skrip menggunakan API JSON, tetapi saya ingin tahu apakah sudah ada yang seperti ini di dalamnya.

Catskul
sumber
Anda juga dapat menggunakan alat khusus seperti CatLight Build Monitor yang akan menampilkan status build dalam baki.
alex
Setiap posting di sini tampaknya menunjuk ke "bangunan terakhir". Apakah ada permintaan serupa untuk memeriksa status pekerjaan / build nomor X? Sesuatu yang Anda periksa secara real time atau setelah fakta.
David

Jawaban:

38

Saya tidak dapat menemukan alat bawaan jadi saya membuatnya:

#!/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
sumber
Bagaimana Anda mengotentikasi pengguna Jenkins dalam skrip Anda?
Aman Varshney
11

Periksa untuk melihat apakah build sedang berjalan atau tidak

Saya mencoba skrip Python dalam menjawab pertanyaan ini, tetapi tidak berhasil. Saya tidak tahu Python, dan tidak ingin menginvestasikan waktu dalam debugging, tetapi mampu membaca cukup banyak skrip untuk mendapatkan inspirasi darinya.

Yang perlu saya lakukan adalah memeriksa untuk melihat apakah build sedang berjalan atau tidak. Untuk melakukan itu saya menggunakan curl dan grep, seperti ini:

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

  • Jika build sedang dalam proses, grep untuk result\":nullakan mengembalikan 0.
  • Jika build selesai, grep untuk result\":nullakan kembali 1.

Tidak terlalu elegan, tetapi itu bekerja cukup baik untuk kebutuhan saya.

Misalnya, saya memiliki skrip Bash yang memulai pembuatan, kemudian menunggu sampai selesai:

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

Terima kasih atas inspirasinya, Catskul!

Steve HHH
sumber
Saya pergi dan memeriksa implementasi saya saat ini yang berfungsi, dan ini sedikit berbeda dari versi yang saya masukkan dalam jawaban karena beberapa persyaratan kata sandi. Apakah Anda tahu mengapa itu tidak berhasil untuk Anda?
Catskul
Python Script karya besar jika pekerjaan sudah selesai, tetapi jika pekerjaan berjalan, Python Script gagal: TypeError: cannot concatenate 'str' and 'NoneType' objects. Saya tidak tahu Python, jadi saya beralih menggunakan shell dan memberi +1 jawaban Anda untuk inspirasi. Terima kasih!
Steve HHH
Anda bisa menambahkan || dan setelah itu syarat untuk kode keluar 1, curl --silent $ JOB_STATUS_URL | grep result \ ": null> / dev / null || jika [" $? "==" 1 "]; maka GREP_RETURN_CODE = $? Jadi, Anda tidak mendapatkan kode keluar '1' jika Anda menjalankan Jenkins build dan Anda tidak ingin itu gagal
Shachar Hamuzim Rajuan
4

Solusi Python lain:

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
sumber
4

Anda dapat menggunakan skrip Groovy:

  1. Melalui jenkins-cli

    echo 'println(jenkins.model.Jenkins.instance'\
    '.getItem("<JOB-NAME>").lastBuild.building)' \
        | java -jar jenkins-cli.jar -s <JENKINS-URL> groovy =
    

    , di mana =berarti standar masuk. Anda dapat mengotentikasi dengan --username <USER> --password <PASS>atau dengan -i <SSH-PRIVATE-KEY>.

  2. Melalui jenkins-cli atas SSH

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

Saya pikir saya menemukan cara yang lebih mudah. Jika saya mengerti dengan benar, Anda ingin memeriksa hasil build - apakah itu berhasil atau gagal, dengan kata lain.

Perintah "build" Jenkins CLI mengubah kode keluar tergantung pada hasil build, selama Anda menggunakan opsi -satau -fdi akhir.

Sebagai contoh,

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

atau

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

Perhatikan bahwa opsi ada di akhir; ini bukan yang pertama -s, yang digunakan untuk mendefinisikan URL instance Jenkins.

Dan kemudian, untuk mendapatkan hasilnya, Anda dapat menggunakan $?:

echo $?

Jika hasilnya 0, itu berhasil. Jika sesuatu selain 0, itu gagal.

Referensi: Saya tidak dapat menemukan Jenkins contoh umum yang memberikan akses ke halaman ini, tetapi dapat ditemukan dalam contoh Jenkins lokal Anda: http://<url of Jenkins Instance>/cli/command/build. Ini juga menjelaskan perbedaan antara -sdan -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
sumber
2

Anda dapat menggunakan deskriptor simbolis lastBuild:

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

The resultelemen dalam respon berisi string yang menjelaskan hasil dari membangun.

joniale
sumber
2

Untungnya, ada jenkins-cli yang dapat Anda gunakan untuk mendapatkan beberapa informasi dari Jenkins. Sayangnya, Anda tidak dapat mengambil status bangunan menggunakan CLI - yang berarti solusi Anda menggunakan API JSON tidak hanya benar - itu satu-satunya cara terprogram untuk melakukannya.

Selain itu, meskipun sepertinya get-jobmelakukan apa yang Anda inginkan, itu tidak benar-benar mengembalikan hasilnya - itu hanya mengembalikan konfigurasi pekerjaan.

Andrew M.
sumber
2

Skrip lain untuk 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
sumber
Terima kasih. Ini terbukti sangat membantu.
Victor S
0

Anda dapat mencoba ini,

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
sumber