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.
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.
Jawaban:
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)
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
result\":null
akan mengembalikan 0.result\":null
akan 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!
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!
Seorang mantan kolega saya menulis https://github.com/txels/autojenkins yang memiliki sejumlah fitur kenyamanan dan jenis-jenis API yang bekerja dengan instance Jenkins dari Python ...
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()
Anda dapat menggunakan skrip Groovy:
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>
.
Melalui jenkins-cli atas SSH
echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
| ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
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 -s
atau -f
di 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 -s
dan -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.
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-job
melakukan apa yang Anda inginkan, itu tidak benar-benar mengembalikan hasilnya - itu hanya mengembalikan konfigurasi pekerjaan.
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!!"
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