如何在不切换到浏览器的情况下检查 Jenkins 构建状态?
如果需要,我可以使用 JSON API 创建一个脚本,但我想知道是否已经内置了类似的东西。
答案1
我找不到内置工具所以我自己制作了一个:
#!/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)
答案2
检查构建是否正在运行
我尝试了该问题答案中的 Python 脚本,但无法使其工作。我不懂 Python,也不想花时间进行调试,但能够阅读足够多的脚本来从中获得灵感。
我所需要做的就是检查构建是否正在运行。为此,我使用了 curl 和 grep,如下所示:
curl http://myjenkins/job/myjob/lastBuild/api/json | grep --color result\":null
- 如果构建正在进行中,grep
result\":null
将返回 0。 - 如果构建完成,grep
result\":null
将返回 1。
虽然不是特别优雅,但足以满足我的需要。
例如,我有一个 Bash 脚本,它启动构建,然后等待它完成:
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!
答案3
我的一位前同事写道https://github.com/txels/autojenkins它具有大量便捷功能和 API 类型的东西,可以使用 Python 来操作 Jenkins 实例……
答案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()