ฉันจะตรวจสอบสถานะการสร้างเจนกินส์โดยไม่เปลี่ยนเป็นเบราว์เซอร์ได้อย่างไร
หากต้องการฉันสามารถสร้างสคริปต์โดยใช้ JSON API แต่ฉันสงสัยว่ามีบางอย่างในตัวอยู่แล้ว
ฉันจะตรวจสอบสถานะการสร้างเจนกินส์โดยไม่เปลี่ยนเป็นเบราว์เซอร์ได้อย่างไร
หากต้องการฉันสามารถสร้างสคริปต์โดยใช้ JSON API แต่ฉันสงสัยว่ามีบางอย่างในตัวอยู่แล้ว
คำตอบ:
ฉันไม่พบเครื่องมือในตัวดังนั้นฉันจึงสร้าง:
#!/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)
ตรวจสอบเพื่อดูว่าบิลด์ทำงานหรือไม่
ฉันลองใช้สคริปต์ Python ในการตอบคำถามนี้ แต่ไม่สามารถใช้งานได้ ฉันไม่รู้จัก Python และไม่ต้องการลงทุนในการดีบัก แต่ก็สามารถอ่านสคริปต์ได้มากพอที่จะได้รับแรงบันดาลใจจากมัน
สิ่งที่ฉันต้องทำคือตรวจสอบว่ามีบิลด์หรือไม่ ในการทำเช่นนั้นฉันใช้ curl และ grep เช่นนี้:
curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null
result\":null
จะส่งคืนค่า 0result\":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!
TypeError: cannot concatenate 'str' and 'NoneType' objects
. ฉันไม่รู้จัก Python ดังนั้นฉันจึงเปลี่ยนไปใช้ shell และ +1 คำตอบของคุณเพื่อหาแรงบันดาลใจ ขอบคุณ!
อดีตเพื่อนร่วมงานของฉันเขียนhttps://github.com/txels/autojenkinsซึ่งมีฟีเจอร์อำนวยความสะดวกมากมายและประเภทของ API เกี่ยวกับการทำงานกับอินสแตนซ์ของ Jenkins จาก Python ...
โซลูชัน 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()
คุณสามารถใช้สคริปต์ Groovy:
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>
echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
| ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
ฉันคิดว่าฉันพบวิธีที่ง่ายขึ้น หากฉันเข้าใจถูกต้องคุณต้องการตรวจสอบผลลัพธ์ของการสร้าง - หากเป็นความสำเร็จหรือล้มเหลวกล่าวอีกนัยหนึ่ง
คำสั่ง "สร้าง" ของ 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.
คุณสามารถใช้สัญลักษณ์อธิบายlastBuild
:
http://localhost/jenkins/job/<jobName>/lastBuild/api/xml
result
องค์ประกอบในการตอบสนองที่มีสตริงอธิบายผลของการสร้างที่
โชคดีที่มีjenkins-cliที่คุณสามารถใช้เพื่อรับข้อมูลบางอย่างจาก Jenkins น่าเสียดายที่คุณไม่สามารถเรียกคืนสถานะของบิลด์ได้โดยใช้ CLI ซึ่งหมายความว่าโซลูชันของคุณในการใช้ JSON API นั้นไม่เพียง แต่ถูกต้องเท่านั้นซึ่งเป็นวิธีการเขียนโปรแกรมแบบเดียวเท่านั้น
นอกจากนี้ในขณะที่ดูเหมือนว่าget-job
อาจจะทำสิ่งที่คุณต้องการ แต่ก็ไม่ได้ส่งกลับผลลัพธ์ - มันเพียงคืนค่าการกำหนดงาน
สคริปต์อื่นสำหรับ 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!!"
คุณสามารถลองกับสิ่งนี้
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