在进行演讲时,我写了一个Hudson / Jenkins插件(适用于EclipseCon NA 2014) ,但我想发表有关演讲中提到的想法的博客文章。 在这篇文章中,我解释了如何在不使用Web界面的情况下与CI服务器进行交互。

Jenkins / Hudson远程API可以非常方便地快速收集工作状态(甚至可以创建或启动工作!但我不会在此博客文章中介绍这方面)。 让我们看一些例子。

看一下CLI自动执行Jenkins配置任务。

可在http:// hudson-or-jenkins / cli上找到:下载hudson-cli.jar或jenkins-cli.jar并开始使用第一个命令:

$ java -jar jenkins-cli.jar -s http://jenkins.terracotta.eur.ad.sag:8080/ help

最近,我不得不用矩阵作业替换50个作业:创建矩阵作业后,我们决定停用先前的50个作业(永久删除之前)

使用CLI,我可以快速登录:

$ java -jar jenkins-cli.jar -s http://jenkins.xx:8080/ login --username anthony --password password

然后得到工作清单:

$ java -jar jenkins-cli.jar -s http://jenkins.xx:8080/ list-jobs

我将要取消激活的50个作业列表保存在一个文本文件中,然后遍历该列表:

$ while read p; do java -jar jenkins-cli.jar -s http://jenkins.xx:8080/ disable-job $p; done < list_of_jobs.txt

比通过UI更有效,不是吗?

每个URL都可以表示为XML或JSON

如Jenkins文档和Hudson文档中所述 ,您只需将/ api / xml或/ api / json或/ api / python附加到任何Jenkins URL即可看到相应的表示形式

您可以配置响应,并在URL上添加一些参数:

深度

默认深度为0,以获取有关您的工作,构建等的更多详细信息,将深度设置为1: http : //ci.jruby.org/api/xml? depth=1

当该参数大于1时(它实际上超过1…时),此参数可能会对您的CI服务器有害,因为响应往往会变得很大。

tree参数允许您选择响应的某些部分http://ci.jruby.org/api/xml?depth=1&tree=jobs[displayName,lastBuild[result]]

xpath和排除(仅XML)

这些参数可能是最强大的参数,可悲的是它们仅可用于xml响应:

如果我只想显示不成功的作业,则可以使用以下URL: http : //ci.jruby.org/api/xml? depth=1& tree= jobs[displayName,lastBuild[result]]& exclude=hudson/ job [lastBuild [result ='SUCCESS']]

而且,如果我只想查看名称以“ jruby”开头的作业,则可以将Xpath函数应用于url: http ://ci.jruby.org/api/xml?xpath=hudson/ job [starts-with(名称,'jruby')]&wrapper = mywrap

詹金斯和哈德森公共实例URL很少

找到一些公共的Jenkins和Hudson实例来练习最新的URL过滤是很容易的(Google用于“ Hudson Dashboard”或“ Jenkins Dashboard”),但是要查找最新的和有意义的(很少的工作)实例比较困难:

詹金斯:

http://ci.jruby.org/

https://jenkins.ci.cloudbees.com/job/plugins/

哈德森:

  • http://deadlock.netbeans.org/hudson/
  • https://hudson.eclipse.org/hudson/
  • https://hudson.eclipse.org/p2/

也就是说,请先尝试您的本地实例!

Jenkins和Hudson远程API脚本

Jenkins / Hudson远程API的主要兴趣是通过您自己的软件与之交互:我在这里收集一些脚本语言的示例

Groovy Script解析Jenkins Hudson构建结果

class BuildParser {
  static void main(String[] args) {
    if (args.length != 1) {
      println("Please run the script with a Jenkins or Hudson url as the only argument\n Example : groovy BuildParser.groovy http://ci.jruby.org");
      return;
    }
    def url = args[0];
    def xmlInputFilteringSuccess = new XmlParser().parse(url + "/api/xml?depth=1&tree=jobs[displayName,lastBuild[result]]&exclude=hudson/job[lastBuild[result=%27SUCCESS%27]]");
    def xmlInputNoFilter = new XmlParser().parse(url + "/api/xml?depth=1&tree=jobs");
 
    def jobs = xmlInputFilteringSuccess.job;
    println(jobs.size() + " jobs out of " + xmlInputNoFilter.job.size() + " are currently failing")
    jobs.each(
        {
          println(
              it.displayName.text() +
              " result is " + it.lastBuild.result.text())
        }
    )
  }
}

解析Jenkins Hudson构建结果的Python脚本

import ast
import urllib
import sys

if len(sys.argv) != 2:
  print "Please run the script with a Jenkins or Hudson url as the only argument\n Example : python BuildParser.py http://ci.jruby.org"
  sys.exit(1)

url = str(sys.argv[1])
print url

xml_input_no_filter = ast.literal_eval(urllib.urlopen(url + "/api/python?depth=1&tree=jobs[displayName,lastBuild[result]]").read())

all_jobs = xml_input_no_filter['jobs']
non_successful_jobs = [row for row in all_jobs if 'SUCCESS' != row['lastBuild']['result']]

print(str(len(non_successful_jobs)) + " jobs out of " + str(len(all_jobs)) + " are currently failing")

for (i, item) in enumerate(non_successful_jobs):
  print "Job name : " + item['displayName'] + "Result : " + item['lastBuild']['result']

JavaScript代码解析Jenkins Hudson构建结果

<!-- Strongly inspired by https://gist.github.com/alexschwartz/912787 -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  <title>Build Parser</title>
 
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" type="text/javascript"></script>
 
  <script type="text/javascript">
    $(document).ready(function(){
      var baseUrl;
      $('button').click(function(){
        baseUrl = $("#baseUrl").val();
        $("#jobUrl").html(baseUrl)
 
        var success = function(json) {
          var allJobs = json["jobs"];
          var nonSuccessfulJobs = allJobs.filter(function( job ) {
            return job["lastBuild"] != null && job["lastBuild"]["result"] != "SUCCESS";
          });
 
          $("#downstream").html(nonSuccessfulJobs.length + " out of " + allJobs.length + " are currently failing");
          $.each(nonSuccessfulJobs, function( index, value ) {
            $("#downstream").append("<br />Job name : " + value["displayName"] + " : "+ value["lastBuild"]["result"] );
          });
        };
 
        $.ajax({
          url: baseUrl + "/api/json",
          data: "depth=1&tree=jobs[displayName,lastBuild[result]]&jsonp=callBack",
          jsonpCallback: "callBack",
          dataType: 'jsonp',
 
          success: success
        });
      });
    });
  </script>
</head>
<body marginwidth="50" marginheight="50" topmargin="50" leftmargin="50">
<h3>Input Data</h3>
 
Hudson/Jenkins Base URL:
<input type="text" id="baseUrl" value="https://hudson.eclipse.org/hudson/" size="80" /><br/>
 
<button>update</button><br />
 
<h2>Output</h2>
 
<h3>Failing Jobs</h3>
<div id="downstream">
</div>
 
</body></html>
  • 您可以在Github上找到这些脚本! 甚至在浏览器中为Javascript Jenkins Hudson Build解析器脚本执行它们

翻译自: https://www.javacodegeeks.com/2014/04/using-jenkins-hudson-remote-api-to-check-jobs-status.html