如何从命令行检查Jenkins构建的构建状态?


40

如何在不切换到浏览器的情况下检查Jenkins的构建状态?

如果需要,我可以使用JSON API创建脚本,但是我想知道是否已经内置了这样的东西。


您还可以使用诸如CatLight Build Monitor之类的专用工具,这些工具会在任务栏中显示构建状态。
Alex

这里的每个帖子似乎都指向“最后构建”。是否有类似的查询来检查作业/内部编号X的状态?您正在实时或事后检查的内容。
大卫

Answers:


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用户?
阿曼·瓦什尼

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。

并不是特别优雅,但是可以满足我的需求。

例如,我有一个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!


我去检查了当前的实现方式,由于某些密码要求,它与答案中的版本有些不同。您知道为什么它不适合您吗?
Catskul

如果作业已经完成,Python脚本会很好用,但是如果作业正在运行,则Python脚本会失败:TypeError: cannot concatenate 'str' and 'NoneType' objects。我不了解Python,所以我改用shell,并为您的灵感+1了答案。谢谢!
史蒂夫HHH

您可以添加|| 然后是退出代码1的条件,curl --silent $ JOB_STATUS_URL | grep result \“:null> / dev / null ||如果[” $?“ ==” 1“];那么GREP_RETURN_CODE = $?因此,如果您在Jenkins版本中运行,则不会得到退出代码'1'。你不希望它失败。
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. 通过詹金斯-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. 通过SSH通过jenkins-cli

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

3

我想我找到了一种更简单的方法。如果我理解正确,那么您想检查构建的结果-换句话说,它是成功还是失败。

Jenkins CLI的“ build”命令根据构建结果更改退出代码,只要您最后使用-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

请注意,该选项位于结尾处;它不是first -s,用于定义Jenkins实例的URL。

然后,要获得结果,可以使用$?

echo $?

如果结果为0,则表示成功。如果不是0,则失败。

参考:我找不到可以访问此页面的公共Jenkins实例,但是可以在您本地的Jenkins实例中找到它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可能会做您想要的事情,但实际上并不会返回结果-它只会返回作业配置。


2

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

谢谢。事实证明这很有帮助。
Victor S

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.