Bir Jenkins derlemesinin yapı durumunu komut satırından nasıl kontrol edebilirim?


40

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.


Tepsideki yapı durumunu gösteren CatLight Yapı İzleyicisi gibi özel araçlar da kullanabilirsiniz .
alex,

Buradaki her yazı "son yapı" olarak işaret ediyor. X iş / yapı durumunu kontrol etmek için benzer bir sorgu var mı? Gerçek zamanlı ya da gerçek sonra kontrol ettiğiniz bir şey.
David

Yanıtlar:


38

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)

Komut dosyasında kimliği doğrulanmış Jenkins kullanıcısı nasılsın?
Aman Varshney

11

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

  • Bir derleme devam ediyorsa, bir grep için result\":null0 döndürülür.
  • Bir derleme bittiğinde, için bir grep result\":null1 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!


Çalıştığım şu anki uygulamamı kontrol ettim ve bazı şifre gereklilikleri nedeniyle cevabını verdiğim versiyondan biraz farklı. Neden senin için işe yaramadığını biliyor musun?
Catskul

Bir iş zaten bitmiş ise Python komut harika çalışır, ancak bir iş çalışıyorsa, Python komut başarısız olur: 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!
Steve HHH,

Ekleyebilirsiniz || ve bundan sonra çıkış kodu 1'in koşulu - curl --silent $ JOB_STATUS_URL | grep result \ ": null> / dev / null || if [" $? "==" 1 "]; o zaman GREP_RETURN_CODE = $? Böylece, Jenkins build içerisinde çalışıyorsanız, '1' çıkış kodunu alamazsınız. ve başarısız olmasını istemiyorsunuz
Shachar Hamuzim Rajuan


4

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()

4

Bir Groovy komut dosyası kullanabilirsiniz:

  1. 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>.

  2. Via SSH üzerinde Jenkins-cli

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

3

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 -sveya -fseç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; -sJenkins ö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 -sve 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.

2

Sembolik tanımlayıcıyı kullanabilirsiniz lastBuild:

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

Yanıttaki resultöğe, derlemenin sonucunu açıklayan bir dize içerir.


2

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-jobistediğinizi yapabilir gibi gözükse de, aslında sonucu döndürmez - yalnızca iş yapılandırmasını döndürür.


1

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!!"

0

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.