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

Cat*_*kul 47 scripting command-line-interface jenkins

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

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

Cat*_*kul 42

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

#!/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)
Run Code Online (Sandbox Code Playgroud)

  • 您如何在脚本中对 Jenkins 用户进行身份验证? (2认同)

Ste*_*HHH 14

检查构建是否正在运行

我在这个问题的答案中尝试了 Python 脚本,但无法让它工作。我不会 Python,也不想在调试上投入任何时间,但能够阅读足够的脚本以从中获得灵感。

我需要做的就是检查构建是否正在运行。为此,我使用了 curl 和 grep,如下所示:

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

  • 如果构建正在进行中,grep forresult\":null将返回 0。
  • 如果构建完成,grep forresult\":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
Run Code Online (Sandbox Code Playgroud)

谢谢你的灵感,Catskul!


Tom*_*nor 6

我的一个前同事写了https://github.com/txels/autojenkins,它有一大堆方便的特性和 API 类型的东西,围绕着从 Python 使用 Jenkins 实例......


小智 6

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

只要您在最后使用-s或选项,Jenkins CLI 的“build”命令就会根据构建结果更改退出代码。-f

例如,

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -s
Run Code Online (Sandbox Code Playgroud)

或者

java -jar jenkins-cli.jar -s <url of Jenkins instance> build <project> -f
Run Code Online (Sandbox Code Playgroud)

请注意,该选项位于末尾;它不是第一个-s,它用于定义 Jenkins 实例的 URL。

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

echo $?
Run Code Online (Sandbox Code Playgroud)

如果结果为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.
Run Code Online (Sandbox Code Playgroud)


小智 5

另一个 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()
Run Code Online (Sandbox Code Playgroud)


two*_*rec 5

您可以使用 Groovy 脚本:

  1. 通过詹金斯-cli

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

    ,其中=表示标准 in。您可以使用--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
    
    Run Code Online (Sandbox Code Playgroud)