Jenkins插件开发简要介绍
环境变量
为了能开发插件,开发环境需安装Maven和JDK 6.0以上版本
配置maven的settings.xml配置文件
1 | <settings> |
创建新的插件
创建插件之前需运行以下Maven命令:
1 | mvn -cpu hpi:create |
该操作需要你输入一些参数,比如说groupid,artifactid。之后会创建一个新的插件模板便于开发者之后的开发工作。确保你可以使用一下命令:
1 | cd newly-create-directory |
设置Eclipse开发环境
1 | mvn -DdownloadSources=true -DdownloadJavadocs=true -DoutputDirectory=target/eclipse-classes eclipse:eclipse |
或者 使用m2eclipse插件在Eclipse打开即可
插件目录结构
pom.xml:Maven的构建配置文件
src/main/java:Java源文件目录
src/main/resources:插件Jelly/Grovy视图
src/main/webapps:插件的静态资源如images和html文件
插件调试
插件开发中在使用一下命令对插件进行调试
Windows
1 | set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n |
Linux
1 | export MAVEN_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n" |
改变端口
1 | mvn hpi:run -Djetty.port=8090 |
设置comtext path
1 | mvn hpi:run -Dhpi.prefix=/jenkins |
插件发布
1 | mvn package |
源码分析
1 | import hudson.Launcher; |
这里主要使用了jenkins的Builder作为扩展点,通过内部类DescripotorImpl添加@Extension声明,告诉系统该内部类是作为BuildStepDescriptor的扩展出现
这里基本完成了扩展点的后台代码部分,但是扩展过程中还需要对前端页面进行扩张,这时就需要建立一个pcakage放置该扩展类对应的视图
视图有三种:1,全局配置(global.jelly)2,Job配置(config.jeely),还有就是使用帮助(help-字段名).html
global.jeely(对于插件需要使用的全局配置)
1 | <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"> |
将插件部署到Jenkins后实际效果如下图(系统管理-系统设置)
config.jeely(正对每个Job而言需要的配置信息)
1 | <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"> |
部署到jenkins后的实际效果
这里细心的人可能已经看出来了,config.jelly中定义的字段实际就是扩展类中构造函数的参数,对于HelloWorldBuilder类而言自成了Builder父类,通过使用@DataBoundConstructor申明,当用户在界面填写配置信息点击保存后将自动初始化该类,同时会在对应的job的配置文件中保存相关信息本机是在.jenkins\jobs\TestJob目录下的config.xml文件中点击查看文件,在publishers节点下即可看见与该插件有关的信息
1 | <prebuilders> |
每一次修改配置并保存时都将修改该配置文件。
在Job进行构建时,将会激活HelloWorldBuilder类的perform方法,而该方法中就是你插件真正开始完成工作的地方
1 | public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) |
listener是此次构建工作的监听器
通过该listener可以输出内容信息到前端jenkins页面
使用build可以判断当前构建工作的结果