在上一篇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. qt——简单程序一步步来

    最简单的程序c1 #include "test.h" #include <QtGui/QApplication> #include <qapplication.h ...

  2. 鸟哥linux私房菜学习笔记,U盘安装centos5.3不能正常进入图形界面的问题

    前面说过自己成功引导了centos系统,现在进入启动界面,首次进入会进行相关设置,按照步骤一步一步完成,取消完光盘安装,点击下一步,就进入下面这个界面,没有登录框...没错!怎么蓝屏了,这可是linu ...

  3. 基于.net core webapi和mongodb的日志系统

    开发环境vs2017,.NET Core2.1, 数据写入到mongodb.思路就是1.提供接口写入日志,2.基于接口封装类库.3.引入类库使用 源码在最后 为什么要写它 很多开源项目像nlog.lo ...

  4. 20145325张梓靖 《Java程序设计》第2周学习总结

    20145325张梓靖 <Java程序设计>第2周学习总结 教材学习内容总结 整数 short 2字节,int 4字节,long 8字节 字节 byte 1字节 浮点数 float 4字节 ...

  5. labview学习之“创建数组”函数

    “创建数组”函数 一.位置:“函数”-“编程”-“数组”-“创建数组” 其图标为: 图1 图标 二.简介: “创建数组”函数有两种模式,一种是“连接模式”,一种是“添加模式”. 如需切换两种模式,可右 ...

  6. C# 版本和.NET 版本以及VS版本的对应关系

    https://en.wikipedia.org/wiki/C_Sharp_(programming_language)#Versions http://stackoverflow.com/quest ...

  7. Python学习札记(二十六) 函数式编程7 修饰器

    修饰器 NOTE 1.函数对象有一个__name__属性,可以拿到函数的名字: #!/usr/bin/env python3 def now(): print('2017/2/19') def mai ...

  8. Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)

    http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...

  9. ongene database

    http://ongene.bioinfo-minzhao.org/index.html

  10. Chain of Responsibility(责任链)

    意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性: 有多个的对象可以处理一个请求,哪个对 ...