Jenkins inşa durumunu tarayıcıya geçmeden nasıl kontrol edebilirim?
Gerekirse, JSON API'sini kullanarak bir komut dosyası oluşturabilirim, ancak zaten böyle bir şey olup olmadığını merak ediyordum.
Jenkins inşa durumunu tarayıcıya geçmeden nasıl kontrol edebilirim?
Gerekirse, JSON API'sini kullanarak bir komut dosyası oluşturabilirim, ancak zaten böyle bir şey olup olmadığını merak ediyordum.
Yanıtlar:
Yerleşik bir alet bulamadım, ben de yaptım:
#!/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)
Bir yapının çalışıp çalışmadığını kontrol edin
Python betiğini bu sorunun cevabında denedim ama çalışmasını sağlayamadım. Python'u tanımıyorum ve hata ayıklamaya hiç zaman ayırmak istemiyordum, ancak ondan ilham almak için senaryoyu yeterince okuyabiliyordum.
Tek yapmam gereken bir yapının çalışıp çalışmadığını kontrol etmek. Bunu yapmak için curl ve grep kullandım, şöyle:
curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null
result\":null
0 döndürülür.result\":null
1 döndürür.Özellikle şık değil, ama ihtiyaçlarım için yeterince iyi çalışıyor.
Örneğin, bir derleme başlatan bir Bash betiğim var, ardından bitmesini bekler:
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
İlham için teşekkürler, Catskul!
TypeError: cannot concatenate 'str' and 'NoneType' objects
. Python'u tanımıyorum, bu yüzden kabuk kullanmaya başladım ve ilham için cevabınızı + 1'ledim. Teşekkürler!
Eski bir meslektaşım, Python'dan bir Jenkins örneği ile çalışmanın etrafında bir sürü kolaylık özellikleri ve API türü şeyler içeren https://github.com/txels/autojenkins yazdı ...
Başka bir Python çözümü:
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()
Bir Groovy komut dosyası kullanabilirsiniz:
Via Jenkins-cli
echo 'println(jenkins.model.Jenkins.instance'\
'.getItem("<JOB-NAME>").lastBuild.building)' \
| java -jar jenkins-cli.jar -s <JENKINS-URL> groovy =
, burada =
standart anlamına gelir. ile --username <USER> --password <PASS>
veya ile kimlik doğrulaması yapabilirsiniz -i <SSH-PRIVATE-KEY>
.
echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
| ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
Sanırım daha kolay bir yol buldum. Doğru anladıysam, derlemenin sonucunu kontrol etmek istersiniz - bir başarı veya başarısızlık ise, başka bir deyişle.
Jenkins CLI'nın "build" komutu , sonunda -s
veya -f
seçeneğini kullandığınız sürece, derlemenin sonucuna bağlı olarak çıkış kodunu değiştirir .
Örneğin,
java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -s
veya
java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -f
Seçeneğin sona erdiğine dikkat edin; -s
Jenkins örneğinin URL'sini tanımlamak için kullanılan ilk değil .
Ve sonra, sonucu elde etmek için kullanabilirsiniz $?
:
echo $?
Sonuç 0 ise, bir başarıydı. 0'dan farklı bir şeyse, başarısızlık oldu.
Referans: Bu sayfaya erişim sağlayan kamu Jenkins örneğini bulamıyorum, ancak yerel Jenkins örneği bulunabilir: http://<url of Jenkins Instance>/cli/command/build
. Ayrıca -s
ve arasındaki farkı da açıklar -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.
Neyse ki, Jenkins'den biraz bilgi almak için kullanabileceğiniz bir jenkins-cli var. Ne yazık ki, CLI kullanarak bir derlemenin durumunu alamıyorsunuz - bu da JSON API kullanma çözümünüzün sadece doğru olmadığı anlamına gelir - bunu yapmanın tek program yolu.
Ayrıca, get-job
istediğinizi yapabilir gibi gözükse de, aslında sonucu döndürmez - yalnızca iş yapılandırmasını döndürür.
CMD için başka bir komut dosyası (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!!"
Bununla deneyebilirsin
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