在上一篇blog 中我们介绍了如何创建我们第一个jenkins插件,在这一篇blog继续介绍在开发我们的插件过程中需要注意的一些问题。

扩展点选择

Jenkings插件是基于扩展点来实现的,比如基于Builder这个扩展点,那这个插件的功能就是一个构建插件,类似ant-builder(使用ant来执行构建脚本)。Jenkins插件的扩展点有很多,具体可以查询这里。该网页列出了Jenkins所有的扩展点,点击每个扩展点下面Implementations,会列出该扩展点对应的实现类。找到实现类的源码就可以知道具体怎么使用该扩展点了,大部分的代码在github上都可以找到。在前面创建的HelloWorld插件是一个基于Builder扩展点的插件,可以在job 配置页面的Build 中增加该插件,以后每次Job每次构建的时候就会去调用该插件了。

Action介绍

Action是插件用来在Job或Build页面增加功能的一种主要方式,是Jenkins最常用的一个扩展点。从下图中可以看出什么是Action,就是页面左边菜单栏的一个菜单项,还可以在右边的主页面显示相应的功能。

每个继承了Action这个扩展点的插件都要实现3个方法,方法如下:

Action.java
1
2
3
4
5
6
7
public interface Action extends hudson.model.ModelObject {
java.lang.String getIconFileName(); java.lang.String getDisplayName(); java.lang.String getUrlName();
}

第一个是菜单项图片,第二个是菜单名称,第三个是菜单链接。

Action分瞬时和持久2种,这里主要介绍的是瞬时的Action。瞬时的Action可以随时废弃,让另外一个新的Action来取代,适合一些每次构建都要执行操作的插件,但不适合需要保存持久数据的插件。

在Jenkins官网的插件开发指南中,推荐使用Transient***ActionFactory系列的继承点, 有TransientViewActionFactory,TransientProjectActionFactory,TransientBuildActionFactory等,使用该系列的继承点,只需要简单的覆写父类的 createFor方法,就可以实现创建瞬时Action的目的,可以根据不同的需要创建Job,Build,View的Action。

更多内容可以参考这里

Jelly页面

Jenkins插件开发中涉及到页面的开发,比如Job的配置页面,相关插件需要加上相关的配置开关,配置参数时,就需要有一个配置页面来做相应的显示。插件开发中用到的页面是Jelly页面,在第一篇blog中介绍了IDEA中关于jelly的插件,使用该插件可以更加方便 Jelly页面的编写。

Jelly页面的简单例子就不介绍了,官网上都有,这里简单介绍一下Jelly页面相关的一些标签。与JSTL类似,Jelly也有自己的一些标签,如下:

1
2
3
4
5
6
7
8
9
<j:jelly
xmlns:j="jelly:core"
xmlns:st="jelly:stapler"
xmlns:d="jelly:define"
xmlns:l="/lib/layout"
xmlns:t="/lib/hudson"
xmlns:f="/lib/form"
xmlns:i="jelly:fmt"
xmlns:p="/lib/hudson/project">

比如想使用jelly:core标签,就可以在页面中直接使用 j:XX来调用标签的相关功能,其他标签同样按照这个方式来使用。其中jelly:core是常用的功能,比如设置变量,循环,判断等功能。jelly:layout是分层相关的标签,/lib/hudson是jenkins相关的功能,比如设置Job页面图标,Build页面图标等。更多标签相关的内容可以参考这里

配置文件

Jenkins插件开发中还涉及到一类文件,就是配置文件。配置文件不仅可以在Jelly页面中使用,而且可以在Java文件中使用,不过在Java文件中使用的话需要先将配置文件编译成对应的Java文件。

如何在Jelly页面中使用配置文件?首先要在Jelly页面所在的文件夹中放置配置文件,比如 页面在这里dir/myAction.jelly,那么页面对应的配置文件就应该在dir/myAction.properties。注意,配置文件名字需要和页面名字相同,这样页面才可以找到对应的配置文件。比如有个Jelly页面如下:

demo.jelly
1
2
3
4
    <?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core">
<th>${\%allBuildsColumnHeader}</th>
</j:jelly>

其对应的配置文件内容如下:

1
allBuildsColumnHeader=mean time to repair for all history

这样配置了以后,展示Jelly 页面时就可以自动调用配置文件里面的内容了。

如何在Java文件中使用配置文件?一般插件所用的Java配置文件名称都叫做Messages.properties,文件保存在resources目录下。比如我们的插件包结构是jenkins.plugins.myplugin,那么Messages.properties文件就保存在 resources/jenkins/plugins/myplugin/目录下。

如果Java 文件中想要使用配置文件里面的值,需要先执行mvn pacakge命令,执行之后,以上面的例子为例,在target目录下会产生generated-sources/localizer/jenkins/plugins/myplugin/Messages.java这个Java文件,如果配置文件里面有这样的一个配置项:

1
allBuildsColumnHeader=mean time to repair for all history

那么Messages.java里面就会产生这样的2个方法:

Message.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   /**
* mean time to repair for all history
*
*/
public static String allBuildsColumnHeader() {
return holder.format("allBuildsColumnHeader");
} /**
* mean time to repair for all history
*
*/
public static Localizable _allBuildsColumnHeader() {
return new Localizable(holder, "allBuildsColumnHeader");
}

这样在Java文件中就可以直接调用这2个方法了,一般是调用第一个方法。

多语言配置。配置文件的文件名如果不带后缀就是内容是英语的配置文件,比如Messages.properties。如果想让你的插件可以在不同的国家语言下都显示正常的话,就需要将你的配置文件复制多份,在名字后面加上不同的后缀,然后内容换上相关语言的内容。

比如,以上面例子为例,中文的配置文件名称就是Messages_zh_CN.properties,配置文件的页面也要换上相应的中文ASCII编码,这样就可以在中文系统环境下显示中文内容了。如何将中文转ASCII码?可以直接使用Java Home里面的native2ascii命令。

开发经验

在开发Jenkins插件的过程中自己摸索了一些方法,在这里介绍一下,以免让其他同学走弯路。

首先是去到Jenkins的官网WIKI。这里介绍了如何创建你的插件工程,插件扩展点,插件编码和页面如何编写等,内容比较多,但你只需要关注你需要的内容就可以了。

光看Jenkins的WIKI是不够的,有一些页面和类的用法上面没有直接给出,那肿么办呢?很简单:看源码。在github上download下jenkins的源码(这里),在IDE里面打开Jenkins工程,比如想要查看某个jelly页面的用法,就可以在工程中搜索所有jelly页面,看看源码中的页面是怎么写的,我们再拿过来改一下就可以了。类和扩展点不知道如何写,也可以参照这个方法,通过源码了解其他扩展点子类是如何写的,然后再写出自己的插件。

可能在jenkins的源码中还是找不到扩展点的用法,那怎么办呢?这个时候可能就需要去参考其他插件是如何写的了,幸运的是,大部分插件的代码现在都放在了github上,我们可以通过了解其他插件来写出自己的插件。

Jenkins插件开发(三)-- 插件编写的更多相关文章

  1. Jenkins插件开发(四)-- 插件发布

    上一篇blog介绍了插件开发中要注意的一些问题, 我们再来介绍插件开发完成后,如何上传到jenkins的插件中心(这里假设你的代码是放在github上的,使用svn或其他版本管理工具的请参考其他文章) ...

  2. jQuery插件编写及链式编程模型小结

    JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我们就来看看如何把我们常用的功能做出JQu ...

  3. jQuery插件编写及链式编程模型

    jQuery插件编写及链式编程模型小结 JQuery极大的提高了我们编写JavaScript的效率,让我们可以愉快的编写代码,做出各种特效.大多数情况下,我们都是使用别人开发的JQuery插件,今天我 ...

  4. BugScan插件编写高(gǎo)级(jī)教程

    声明:本文最先发布在:http://q.bugscan.net/t/353 转载请注明出处 有问题可以和我交流 邮件(Medici.Yan@gmail.com) 个人博客地址:http://www.c ...

  5. Wireshark插件编写

    Wireshark插件编写 在抓包的过程中学习了使用wireshark,同时发现wireshark可以进行加载插件,便在网上学习了一下相应的插件开发技术. 需求编写一个私有协议名为SYC,使用UDP端 ...

  6. 关于chrome插件编写的小结

    一个插件的大致目录结构如下: 其中manifest文件最为重要,它定义/指明插件应用的相关信息(权限.版本.功能说明等),点此查看Manifest的详情>>   这里有一篇chrome官方 ...

  7. Jenkins插件开发(一)--环境搭建

    最近写了一个jenkins插件,功能比较简单,时间主要是花在对jenkins插件框架和Maven的熟悉上.jenkins插件虽然以前也接触过一点,不过现在都忘得差不多了,这个笔记权当知识点记录,顺带介 ...

  8. Jenkins插件开发(二)-- HelloWorld

    在上一篇blog中我们讲了如何搭建jenkins插件的开发环境,接下来介绍如何开发我们的插件. 创建HelloWorld插件 学习每门新语言的时候,我们都会写一个HelloWorld程序,这里介绍的是 ...

  9. 【eclipse插件开发实战】Eclipse插件开发4——插件JDE、PDE开发方式及plugin.xml配置文件结构

    Eclipse插件开发4--插件JDE.PDE开发方式及plugin.xml配置文件结构 开发方式分为:java开发环境JDE开发插件的方式和插件开发环境PDE开发插件方式. 插件通过添加到预定义的扩 ...

随机推荐

  1. python16_day36【爬虫1】

    一.requests 1. GET请求 # 1.无参数实例 import requests ret = requests.get('https://github.com/timeline.json') ...

  2. lvs原理及各种调度算法详解

    LVS原理详解 LVS原理详解 LVS简介 LVS结构与工作原理 一.LVS的结构 二.LVS内核模型 三.LVS的包转发模型 1.NAT模型: 2.DR模型: 3.TUN模型: 四.LVS的调度算法 ...

  3. 图:无向图(Graph)基本方法及Dijkstra算法的实现 [Python]

    一般来讲,实现图的过程中需要有两个自定义的类进行支撑:顶点(Vertex)类,和图(Graph)类.按照这一架构,Vertex类至少需要包含名称(或者某个代号.数据)和邻接顶点两个参数,前者作为顶点的 ...

  4. #C++初学记录(高精度运算)(加法)

    高精度运算 不管是int还是double亦或者long long ,这些定义变量都有数据范围的一定限制,在计算位数超过十几位的数,也就是超过他们自身的数据范围时,不能采用现有类型进行计算,只能自己通过 ...

  5. Python 中的多维字典

    Python中的dict可以实现迅速查找.那么有没有像数组有二维数组一样,有二维的字典呢?比如我需要对两个关键词进行查找的时候.2D dict 可以通过 dict_2d = {'a': {'a': 1 ...

  6. 使用老毛桃安装Windows操作系统

    首先必须知道什么是PE系统? 当电脑出现问题而不能正常进入系统时候的一种“紧急备用”系统,通常放在U盘中,设置启动项优先级,使得电脑启动的时候加载PE系统. 如何在U盘中安装老毛桃(PE工具箱)? h ...

  7. UI自动化测试框架之Selenium关键字驱动

    一.原理及特点 1. 关键字驱动测试是数据驱动测试的一种改进类型 2. 主要关键字包括三类:被操作对象(Item).操作(Operation)和值(value),用面向对象形式可将其表现为Item.O ...

  8. 根据Excel文件中的内容,修改指定文件夹下的文件名称

    问题:根据Excel文件中内容,把文件名称由第2列,改为第1列.比如:把文件“123.jpg”修改为“1.jpg”.

  9. Linux学习笔记之Linux计划任务Crontab

    0x00 cron 简介 cron 是 UNIX, SOLARIS,LINUX 下的一个十分有用的工具.通过 cron 脚本能使计划任务定期地在系统后台自动运行. 0x01 cron 命令 cront ...

  10. bzoj2733 / P3224 [HNOI2012]永无乡(并查集+线段树合并)

    [HNOI2012]永无乡 每个联通块的点集用动态开点线段树维护 并查集维护图 合并时把线段树也合并就好了. #include<iostream> #include<cstdio&g ...