Làm cách nào để kiểm tra trạng thái bản dựng Jenkins mà không chuyển sang trình duyệt?
Nếu được yêu cầu, tôi có thể tạo tập lệnh bằng API JSON, nhưng tôi tự hỏi liệu đã có thứ gì đó như thế này được tích hợp sẵn chưa.
Làm cách nào để kiểm tra trạng thái bản dựng Jenkins mà không chuyển sang trình duyệt?
Nếu được yêu cầu, tôi có thể tạo tập lệnh bằng API JSON, nhưng tôi tự hỏi liệu đã có thứ gì đó như thế này được tích hợp sẵn chưa.
Câu trả lời:
Tôi không thể tìm thấy một công cụ tích hợp nên tôi đã tạo một công cụ:
#!/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)
Kiểm tra xem bản dựng có chạy hay không
Tôi đã thử tập lệnh Python trong câu trả lời cho câu hỏi này, nhưng không thể làm cho nó hoạt động được. Tôi không biết Python và không muốn đầu tư bất kỳ lúc nào để gỡ lỗi, nhưng đã có thể đọc đủ kịch bản để lấy cảm hứng từ nó.
Tất cả những gì tôi cần làm là kiểm tra xem bản dựng có đang chạy hay không. Để làm điều đó tôi đã sử dụng curl và grep, như thế này:
curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null
result\":null
sẽ trả về 0.result\":null
sẽ trả về 1.Không đặc biệt thanh lịch, nhưng nó hoạt động đủ tốt cho nhu cầu của tôi.
Ví dụ: tôi có một tập lệnh Bash bắt đầu quá trình xây dựng, sau đó đợi nó hoàn thành:
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
Cảm ơn về nguồn cảm hứng, Catskul!
TypeError: cannot concatenate 'str' and 'NoneType' objects
. Tôi không biết Python, vì vậy tôi đã chuyển sang sử dụng shell và +1 câu trả lời của bạn cho cảm hứng. Cảm ơn!
Một đồng nghiệp cũ của tôi đã viết https://github.com/txels/autojenkins , có một loạt các tính năng tiện lợi và công cụ loại API xung quanh làm việc với một ví dụ Jenkins từ Python ...
Một giải pháp Python khác:
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()
Bạn có thể sử dụng tập lệnh Groovy:
Qua jenkins-cli
echo 'println(jenkins.model.Jenkins.instance'\
'.getItem("<JOB-NAME>").lastBuild.building)' \
| java -jar jenkins-cli.jar -s <JENKINS-URL> groovy =
, trong đó =
có nghĩa là tiêu chuẩn. Bạn có thể xác thực bằng --username <USER> --password <PASS>
hoặc với -i <SSH-PRIVATE-KEY>
.
echo -e 'println(jenkins.getItem("JOB-NAME").lastBuild.building)\nexit' \
| ssh -p <JENKINS-SSH-PORT> <JENKINS-HOST> groovysh
Tôi nghĩ rằng tôi đã tìm thấy một cách dễ dàng hơn. Nếu tôi hiểu chính xác, bạn muốn kiểm tra kết quả của bản dựng - nếu đó là thành công hay thất bại, nói cách khác.
Lệnh "build" của Jenkins CLI thay đổi mã thoát tùy thuộc vào kết quả của quá trình xây dựng, miễn là bạn sử dụng tùy chọn -s
hoặc -f
tùy chọn ở cuối.
Ví dụ,
java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -s
hoặc là
java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -f
Lưu ý rằng tùy chọn đi ở cuối; đây không phải là lần đầu tiên -s
, được sử dụng để xác định URL của ví dụ Jenkins.
Và sau đó, để có kết quả, bạn có thể sử dụng $?
:
echo $?
Nếu kết quả là 0, đó là một thành công. Nếu đó là một cái gì đó khác 0, thì đó là một thất bại.
Tham khảo: Tôi không thể tìm thấy một phiên bản Jenkins công khai cho phép truy cập vào trang này, nhưng nó có thể được tìm thấy trong ví dụ Jenkins địa phương của bạn : http://<url of Jenkins Instance>/cli/command/build
. Nó cũng giải thích sự khác biệt giữa -s
và -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.
May mắn thay, có một jenkins-cli mà bạn có thể sử dụng để lấy một số thông tin từ Jenkins. Thật không may, bạn không thể truy xuất trạng thái của bản dựng bằng CLI - điều đó có nghĩa là giải pháp sử dụng API JSON của bạn không chỉ đúng - đó là cách lập trình duy nhất để làm như vậy.
Ngoài ra, mặc dù có vẻ như get-job
có thể làm những gì bạn muốn, nhưng nó không thực sự trả về kết quả - nó chỉ trả về cấu hình công việc.
Một tập lệnh khác cho 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!!"
Bạn có thể thử với điều này,
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