ฉันจะตรวจสอบสถานะการสร้างของการสร้างเจนกินส์จากบรรทัดคำสั่งได้อย่างไร


40

ฉันจะตรวจสอบสถานะการสร้างเจนกินส์โดยไม่เปลี่ยนเป็นเบราว์เซอร์ได้อย่างไร

หากต้องการฉันสามารถสร้างสคริปต์โดยใช้ JSON API แต่ฉันสงสัยว่ามีบางอย่างในตัวอยู่แล้ว


คุณยังสามารถใช้เครื่องมือพิเศษเช่นCatLight Build Monitorที่จะแสดงสถานะการสร้างในถาด
alex

โพสต์ทั้งหมดที่นี่ดูเหมือนจะชี้ไปที่ "สร้างครั้งสุดท้าย" มีคิวรีที่คล้ายกันสำหรับการตรวจสอบสถานะของงาน / หมายเลขบิลด์ X หรือไม่? สิ่งที่คุณกำลังตรวจสอบในเวลาจริงหรือหลังความจริง
David

คำตอบ:


38

ฉันไม่พบเครื่องมือในตัวดังนั้นฉันจึงสร้าง:

#!/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)

คุณรับรองความถูกต้องของผู้ใช้ Jenkins ในสคริปต์ของคุณอย่างไร?
Aman Varshney

11

ตรวจสอบเพื่อดูว่าบิลด์ทำงานหรือไม่

ฉันลองใช้สคริปต์ Python ในการตอบคำถามนี้ แต่ไม่สามารถใช้งานได้ ฉันไม่รู้จัก Python และไม่ต้องการลงทุนในการดีบัก แต่ก็สามารถอ่านสคริปต์ได้มากพอที่จะได้รับแรงบันดาลใจจากมัน

สิ่งที่ฉันต้องทำคือตรวจสอบว่ามีบิลด์หรือไม่ ในการทำเช่นนั้นฉันใช้ curl และ grep เช่นนี้:

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

  • หากบิลด์อยู่ในระหว่างดำเนินการ grep สำหรับresult\":nullจะส่งคืนค่า 0
  • หากการสร้างเสร็จสิ้น grep สำหรับresult\":nullจะคืนค่า 1

ไม่หรูหราโดยเฉพาะ แต่มันทำงานได้ดีพอสำหรับความต้องการของฉัน

ตัวอย่างเช่นฉันมีสคริปต์ทุบตีที่เริ่มสร้างจากนั้นรอให้เสร็จ:

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

ขอบคุณสำหรับแรงบันดาลใจ Catskul!


ฉันไปและตรวจสอบการใช้งานปัจจุบันของฉันซึ่งใช้งานได้และมันแตกต่างจากเวอร์ชั่นที่ฉันตอบเพราะความต้องการรหัสผ่านบางอย่าง คุณรู้ไหมว่าทำไมมันถึงไม่ได้ผลสำหรับคุณ
Catskul

สคริปต์ Python ใช้งานได้ดีหากงานเสร็จสิ้นแล้ว แต่ถ้างานกำลังทำงานอยู่สคริปต์ Python จะล้มเหลว: TypeError: cannot concatenate 'str' and 'NoneType' objects. ฉันไม่รู้จัก Python ดังนั้นฉันจึงเปลี่ยนไปใช้ shell และ +1 คำตอบของคุณเพื่อหาแรงบันดาลใจ ขอบคุณ!
Steve HHH

คุณสามารถเพิ่ม || และหลังจากนั้นเงื่อนไขสำหรับรหัสทางออก 1 ให้ curl --silent $ JOB_STATUS_URL | grep result \ ": null> / dev / null || ถ้า [" $? "==" 1 "]; ดังนั้น GREP_RETURN_CODE = $ ดังนั้นคุณจะไม่ได้รับรหัสทางออก '1' ในกรณีที่คุณกำลังทำงานใน Jenkins build และคุณไม่ต้องการให้มันล้มเหลว
Shachar Hamuzim Rajuan


4

โซลูชัน 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()

4

คุณสามารถใช้สคริปต์ 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 =
    

    ซึ่ง=หมายความว่าในมาตรฐาน. คุณสามารถตรวจสอบกับหรือ--username <USER> --password <PASS>-i <SSH-PRIVATE-KEY>

  2. Via jenkins-cli เหนือ SSH

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

3

ฉันคิดว่าฉันพบวิธีที่ง่ายขึ้น หากฉันเข้าใจถูกต้องคุณต้องการตรวจสอบผลลัพธ์ของการสร้าง - หากเป็นความสำเร็จหรือล้มเหลวกล่าวอีกนัยหนึ่ง

คำสั่ง "สร้าง" ของ Jenkins CLI จะเปลี่ยนรหัสออกโดยขึ้นอยู่กับผลลัพธ์ของการสร้างตราบใดที่คุณใช้-sหรือ-fตัวเลือกในตอนท้าย

ตัวอย่างเช่น,

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

หรือ

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

ขอให้สังเกตว่าตัวเลือกไปที่จุดสิ้นสุด; มันไม่ใช่อันแรก-sซึ่งใช้เพื่อกำหนด URL ของอินสแตนซ์ของเจนกินส์

จากนั้นเพื่อให้ได้ผลลัพธ์คุณสามารถใช้$?:

echo $?

หากผลลัพธ์เป็น 0 แสดงว่าเป็นความสำเร็จ หากเป็นอย่างอื่นที่ไม่ใช่ 0 แสดงว่าเป็นความล้มเหลว

อ้างอิง: ฉันไม่สามารถหาอินสแตนซ์เจนกินส์ของประชาชนที่ช่วยให้การเข้าถึงหน้านี้ http://<url of Jenkins Instance>/cli/command/buildแต่ก็สามารถพบได้ในอินสแตนซ์เจนกินส์ในท้องถิ่นของคุณ: นอกจากนี้ยังอธิบายถึงความแตกต่างระหว่าง-sและ-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

คุณสามารถใช้สัญลักษณ์อธิบายlastBuild:

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

resultองค์ประกอบในการตอบสนองที่มีสตริงอธิบายผลของการสร้างที่


2

โชคดีที่มีjenkins-cliที่คุณสามารถใช้เพื่อรับข้อมูลบางอย่างจาก Jenkins น่าเสียดายที่คุณไม่สามารถเรียกคืนสถานะของบิลด์ได้โดยใช้ CLI ซึ่งหมายความว่าโซลูชันของคุณในการใช้ JSON API นั้นไม่เพียง แต่ถูกต้องเท่านั้นซึ่งเป็นวิธีการเขียนโปรแกรมแบบเดียวเท่านั้น

นอกจากนี้ในขณะที่ดูเหมือนว่าget-jobอาจจะทำสิ่งที่คุณต้องการ แต่ก็ไม่ได้ส่งกลับผลลัพธ์ - มันเพียงคืนค่าการกำหนดงาน


1

สคริปต์อื่นสำหรับ 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!!"

0

คุณสามารถลองกับสิ่งนี้

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.