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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据分析和人工智能科普

一、大数据 1.1 大数据&#xff08;Big Data&#xff09; 众说纷纭&#xff01; 个人认为&#xff0c;大数据中的“大”&#xff0c;不仅仅是涉及数据规模&#xff0c;而且包含“价值“这个层面。其实无非就是大量的信息罢了&#xff0c;但是我们却能 通过各种手段从这些信息中…

Redis API的使用与理解

一、Redis 基础&#xff1a; 1、通用命令&#xff1a; keys [pattern]&#xff1a; keys * #遍历所有key&#xff1b;keys he* #以he开头的key&#xff1b; keys he[a-e]* #以‘he’开头第三个字母是a-e之间&#xff1b; keys ph? #?代码一位&#xff0c;以ph开头且字母是…

点击底部input输入框,弹出的软键盘挡住input(苹果手机使用第三方输入法 )

测试移动端页面的时候&#xff0c;偶然发现点击底部input输入框时&#xff0c;弹出的虚拟键盘偶尔会挡住input输入框。 输入框固定在页面底部&#xff0c;如图所示&#xff1a; input固定底部设计图.png点击底部input输入框唤起软键盘时&#xff0c;软键盘挡住输入框。如图所示…

java采集温湿度水浸_机房水浸传感器:智能生活不可或缺的漏水传感器

原标题&#xff1a;机房水浸传感器&#xff1a;智能生活不可或缺的漏水传感器智能化的飞速发展让人们的生活发生了重大改变&#xff0c;为保证机房的安全、稳定、高效运行&#xff0c;网络设备的良好运行状态和设备使用寿命与安全&#xff0c;通常会对网络运行环境的电力供应、…

以编程方式访问Java基本类型的大小

许多不熟悉Java的开发人员首先要了解的一件事是Java的基本原始数据类型 &#xff0c;其固定&#xff08;与平台无关&#xff09;的大小&#xff08;以位或字节为单位用二进制补码表示 &#xff09;以及它们的范围&#xff08;Java中所有数字类型都是带符号的&#xff09; &…

oracle用EXPLAIN PLAN 分析SQL语句

EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称. 你需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果…

创建型模式:原型模式

个人公众号原文&#xff1a;创建型模式&#xff1a;原型模式 五大创建型模式之五&#xff1a;原型模式。 简介 姓名 &#xff1a;原型模式 英文名 &#xff1a;Prototype Pattern 价值观 &#xff1a;效率第一 个人介绍 &#xff1a; Specify the kinds of objects to create u…

我的前端工具集(五)提示工具之模态窗提示

我的前端工具集&#xff08;五&#xff09;提示工具之模态窗提示 liuyuhang原创&#xff0c;未经允许禁止转载 目录 我的前端工具集 1、需求 很多页面操作都需要提示&#xff0c;比如操作成功&#xff0c;操作失败之类。 总不能没事就console.log或者alert吧。 所以一个操作提…

min-width:100%和max-width:100%的区别

1.width:100%和width:auto width:100%,设定对象的宽度占父元素的100%不论设定元素的margin值是多少,不包含margin&#xff1b; width:auto&#xff0c;根据设定对象的实际大小而自适应宽度&#xff0c;考虑设定元素的Margin值得大小&#xff0c;包含Margin 2.max-width:100%和m…

Java 8 Friday:可选将保留为Java中的一个选项

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五&#xff0c;我们都会向您展示一些不错的教程风格的Java 8新功能&#…

java动态拼接请求_在JavaWeb项目中处理静态文件或动态链接拼接网站地址的最优处理方案...

在开发网站时候我们会遇到下面问题&#xff1f;- 在引用网页中引用js和css或者动态的Servlet的时候我们是写绝对路径还是相对路径&#xff1f;- 如果写相对路径吧&#xff0c;上线偶尔会报404&#xff0c;还要手动去拼接绝对路径- 如果写绝对路径吧&#xff0c;你在本地写的时候…

新增数据库栏位脚本

IF NOT EXISTS(SELECT * FROM SYSCOLUMNSWHERE IDOBJECT_ID(NMNDIndicator) AND NAMENcheckperiod)BEGINALTER TABLE MNDIndicator ADD checkperiod NVARCHAR(100) NULL default END 转载于:https://www.cnblogs.com/snowball/archive/2007/05/14/745213.html

七天开发记录(3)

今天在网上找到了一个开发记账本微信小程序的网址 我看了一下这个APP的源代码&#xff0c;其用分为两个大包。 转载于:https://www.cnblogs.com/zjl-0217/p/10428525.html

做个商城吧(〇)

做个商城吧&#xff08;〇&#xff09; liuyuhang原创&#xff0c;未经允许进制转载&#xff01; 作为自己想写的一个系列&#xff0c;应该仔细认真的更下来 目录在文末 1、想法 自己一个人做个商城&#xff0c;这种想法一直萦绕着。 但是也有不同的声音&#xff1a; 有淘宝&am…

链表!比数组更适合做增删操作的数据结构

什么是链表&#xff1f; 链表和数组的对比&#xff1a;在大多数语言中&#xff0c;数组的大小是固定的&#xff0c;从数组的起点或中间添加或删除元素的成本很高&#xff0c;因为需要移动元素。链表中的每一个元素在内存中不是连续放置的&#xff0c;和它左右两侧元素是没有关系…

Java 8中的Base64 –加入乐趣为时不晚

最后&#xff0c;Java 8发布了。 最后&#xff0c;有一种执行Base64编码的标准方法。 长期以来&#xff0c;我们一直依赖于Apache Commons Codec&#xff08;无论如何还是很棒的&#xff09;。 内存敏感的编码人员将拼命使用sun.misc.BASE64Encoder和sun.misc.BASE64Decoder&am…

多层架构模型中的BLL 与 Model的解释

理想状态这两个可以合并到一起来&#xff0c;就是业务对象&#xff0c;但model是把这个业务对象中的数据提取了出来&#xff0c;作为一个数据载体&#xff0c;可以在层间传递。业务对象中除去这些数据剩下的方法就构成了BLL层。显示层Presentation Layer业务逻辑层Business Log…

java创建方法并引用_java – 创建非捕获方法引用,它将调用超类方法

我正在尝试重构以下代码&#xff1a;class Base {private Object a, b, <...>; // theres like 10 of these attributes of different typepublic Object a() {return a;}public Object b() {return b;}// more getters like the ones above}class RootNode extends Base…

maven快速入门

一。前提条件 你的电脑必须安装maven和java 二。检验安装 执行命令&#xff1a;mvn --version 输出&#xff1a; Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T20:41:4702:00) Maven home: D:\apache-maven-3.6.0\bin\.. Java version: 1.8.0_16…

如何使用JSR107缓存注释

最近&#xff0c;我对JSR107缓存注释以及JSR107的实现是否提供它们有一些疑问。 可以将缓存注释添加到Java类中&#xff0c;并将其作为方法调用缓存操作。 例如&#xff0c;下面是带注释的BlogManager。 CacheDefaults(cacheName "blgMngr") public class BlogMan…