在进行演讲时,我写了一个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 sysif 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 urlxml_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

使用Jenkins / Hudson远程API检查作业状态相关推荐

  1. jenkins_使用Jenkins / Hudson远程API检查作业状态

    jenkins 在进行演讲时,我编写了一个Hudson / Jenkins插件(适用于EclipseCon NA 2014) ,但我想发表有关该演讲中提到的想法的博客文章. 在这篇文章中,我解释了如何 ...

  2. jenkins api_接触Jenkins(Hudson)API,第2部分

    jenkins api 这篇文章从本教程的第1部分继续. 已经快一年了,但是我终于有时间重新审视我为与Jenkins api交互而编写的一些代码. 我已经使用了部分工作来帮助管理许多Jenkins构建 ...

  3. 接触Jenkins(Hudson)API,第2部分

    这篇文章从本教程的第1部分继续. 已经快一年了,但是我终于有时间重新审视我为与Jenkins api交互而编写的一些代码. 我已经使用了部分工作来帮助管理许多Jenkins构建服务器,主要是保持插件同 ...

  4. jenkins api_接触Jenkins(Hudson)API,第1部分

    jenkins api 哪一个-哈德森还是詹金斯? 都. 几个月前,我开始使用Hudson v1.395来从事这个小项目,在出现巨大分歧之后又回到了这个项目. 我以此为契机,看我将来选择永久搬到詹金斯 ...

  5. 接触Jenkins(Hudson)API,第1部分

    哪一个-哈德森还是詹金斯? 都. 几个月前,我开始使用Hudson v1.395来从事这个小项目,在出现巨大分歧之后又回到了这个项目. 我以此为契机,看我将来选择永久搬到詹金斯时是否会遇到任何重大问题 ...

  6. Jenkins基础:API:7:使用API对Job进行操作

    在前面的文章中,已经陆续介绍过如何使用API进行Job的创建.拷贝.启用.禁用等操作,这篇文章将进一步介绍如何使用API进行Job构建.取消.删除等操作. Jenkins环境 本文示例的Jenkins ...

  7. 【CoppeliaSim】远程 API 之 Matlab 控制,对比 V-rep 有些不同

    关于与 Python 的连接请参考文章:[CoppeliaSim]远程 API 之 Python 控制,对比 V-rep 有些不同 文章目录 1. 新建工程文件夹 1.1 必备的 .m 文件 1.2 ...

  8. 【CoppeliaSim】远程 API 之 Python 控制,对比 V-rep 有些不同

    关于与 Python 的连接请参考文章:[CoppeliaSim]远程 API 之 Matlab 控制,对比 V-rep 有些不同 文章目录 1. 新建工程文件夹 1.1 sim.py 1.2 sim ...

  9. Confluence 6 启用远程 API

    XML-RPC 和 SOAP 远程 API 从 Confluence 5.5 开始已经废弃了.我们推荐你使用完全支持的 Confluence Server REST API. 希望启用 XML-RPC ...

最新文章

  1. notepad++ java编码,输出中文字符时,编译出错
  2. Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比 Spring配置文件生成约束的菜单方法...
  3. IE7一样可以轻易重装
  4. java 实现websocket的两种方式
  5. 图书管理系统(说明文档与相关代码)
  6. thinkphp5 open_basedir 补充
  7. ELK6.0日志从收集到处理完整版教程(二)
  8. 29.优化 MySQL Server
  9. Windows上优质精选的最佳应用程序及工具列表(附下载链接)
  10. 二阶系统根轨matlab,自控-二阶系统Matlab仿真.doc
  11. 主机当前没有管理网络冗余
  12. 一篇关于蜿蜒型河流的介绍
  13. 图片的 orientation 属性
  14. 毕业设计--20200301--domoticz的智能家居设备---esp8266(micropython)+MQTT 做一个可控开关
  15. 有事的一天,小事一大堆......
  16. myeclipse 6.5 注册码 myeclipse 6.0 注册码
  17. OJ考试特别版,数组模拟链表(比正儿八经用链表简单,结果还对,何乐而不为)
  18. Vector 自定义Sort
  19. 【读点论文】MnasNet: Platform-Aware Neural Architecture Search for Mobile,用神经网络搜索的方式来设计网络平衡精度与速度
  20. 水浒108条好汉排名及派系全解析

热门文章

  1. PostgreSQL 数据类型
  2. 转移指令jmp和跳转指令call
  3. JDK8的日期时间类1
  4. 移位操作提高代码的可读性_本地记录或类,以提高流操作的可读性
  5. 怎么运行aws的示例程序_使Spring Boot应用程序在AWS上无服务器运行
  6. jax-rs jax-ws_如何以大数据的JAX-RS响应的形式将JPA结果流化/序列化
  7. 为什么awt_为AWT的机器人创建DSL
  8. matchers依赖_Hamcrest Matchers的高级创建
  9. Apache Camel 3.1 –即将推出更多骆驼核心优化
  10. java8 默认方法_默认方法:Java 8的无名英雄