如何从命令行检查Jenkins版本的构build状态?

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

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

我找不到一个内置的工具,所以我做了一个:

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

检查构build是否正在运行

我在这个问题的答案中尝试了Python脚本,但不能得到它的工作。 我不懂Python,不想投入任何时间进行debugging,但能够阅读足够的脚本以从中获得灵感。

我所需要做的就是检查构build是否正在运行。 要做到这一点,我使用curl和grep,就像这样:

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

  • 如果构build正在进行,grep for result\":null将返回0。
  • 如果构build完成,grep for result\":null将返回1。

不是特别优雅,但它足够满足我的需求。

例如,我有一个Bash脚本开始构build,然后等待它完成:

 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!

我的一个前同事写道: https : //github.com/txels/autojenkins有一大堆的便利function和APItypes的东西,围绕着从Python的jenkins实例工作。

幸运的是,你可以用jenkins-cli从jenkins获得一些信息。 不幸的是,你不能使用CLI检索构build的状态 – 这意味着你使用JSON API的解决scheme不仅是正确的 – 它是唯一的编程方式。

此外,虽然看起来get-job可能会做你想要的,但实际上并不会返回结果 – 它只返回作业configuration。

我知道问这个问题已经很长时间了,但是我想我find了一个更简单的方法。

如果我理解正确的话,你想检查构build的结果 – 换句话说,如果是成功或失败的话。

Jenkins CLI的“构build”命令根据构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 

请注意,该选项在最后; 它不是第一个-s,它用来定义jenkins实例的url。

然后,为了得到结果,你可以使用$?

 echo $? 

如果结果是0,那是成功的。 如果它不是0,那就是失败。

参考:我找不到可以访问此页面的公共Jenkins实例,但可以在您本地的Jenkins实例中find它: http://<url of Jenkins Instance>/cli/command/build 。 它也解释了-s和-f之间的区别。

另一个python解决scheme:

 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() 

您可以使用符号描述符lastBuild

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

响应中的result元素包含描述构build结果的string。

你可以使用groovy脚本

  1. 通过jenkins-cli

     echo -e 'println(jenkins.model.Jenkins.instance.getItem("<JOB-NAME>").lastBuild.building)' \ | java -jar jenkins-cli.jar -s <JENKINS-URL> groovy = 

    ,其中=表示stdin。 您可以使用--username <USER> --password <PASS>-i <SSH-PRIVATE-KEY>进行身份validation。

  2. 通过jenkins-cli通过ssh

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

其他脚本为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!!"