Jenkins是持续集成运行、管理平台(与hudson一样,具体说明可以查看jenkins的wiki)。jenkins本身提供了一套插件的管理机制,这些插件允许可插拨形式存在。jenkins插件虽然能提供很多种插件,但还是不能满足我们持续集成的需要,所以需要定制一些插件来支撑整个持续集成平台的运行。
Jenkins有自己运行的生命周期,如下:
为了支撑插件能在各个生命周期中运行,jenkins提供了各种扩展点,我们主类必须要extends一个扩展点;针对现状,基本上只需要使用Notifier,与builder这两个扩展点;详细如下:
Ø Builder:这个扩展点支撑的是构建这个阶段需要做的事情,包括prebuild postbuid、构建环境等步骤,例如我们更换slave机器的hosts插件
Ø Notifier:包括通知、消息通知等情况,我们的sendnapolimessage是基于这种扩展点来开发的
具体扩展点说明请参考:https://wiki.jenkins-ci.org/display/JENKINS/Extension+points
l 设置settings.xml(包括代理)
因为插件使用的是maven的管理形式,所以需要settings文件,了解maven的同学应该知道settings文件的作用,这里不多说。需要在我们的settings.xml中添加如下设置:
org.jenkins-ci.tools
jenkins
true
repo.jenkins-ci.org
http://repo.jenkins-ci.org/public/
repo.jenkins-ci.org
http://repo.jenkins-ci.org/public/
repo.jenkins-ci.org
http://repo.jenkins-ci.org/public/
m.g.o-public
由于下载比较慢,所以我添加了一个proxy,具体设置如下:
my-proxy
true
http
218.14.227.197
3128
***
***
repository.mycom.com|*.google.com
l 设置maven3
Jenkins为什么要使用maven3,在使用maven2编译的时候都不会出现问题,但使用mvn-hpi插件的时候,会报空指针异常错误,查看了wiki,这个bug未解决,但切换到maven3该问题消失,应该是maven2对这个插件支持不够完善。
l 创建maven项目(pom文件介绍)
1、 使用mvn –cpucreate:hpi命令。会自己生成一个hellobuilder示例maven工程。,中间让你输入groupid与aid。
2、 在maven中添加我们需要的依赖以及jdk、开发者维护说明。和maven的方式一样。
alibaba
Developer gaofeng.qiangf
xxx
org.apache.maven.plugins
maven-enforcer-plugin
1.0.1
org.apache.maven.plugins
maven-compiler-plugin
1.6
1.6
true
l 导入eclipse
使用命令 mvn eclipse:eclipse,然后再eclipse中使用import功能导入,这个不做详细介绍,相信大家都会使用
l 项目目录介绍(重要):
说明:src目录有三个目录
A、 main管理的是主程序的运行类,如图1标志
B、 resource管理的是该插件需要的配置,例如插件的局部配置、全局配置以及帮助,如图2标示
C、 webapp管理是该插件要引用的静态文件,例如js、html、img等,如图2标志
D、 如果需要做插件的参数化配置,即需要写jelly文件,则必须在resource目录下建一个与主类包名一样(层层嵌套)的文件夹,如图5标志,main->java主类SendBuildResultBuilder.java在resource中有个层级一模一样对应的文件夹。
l 项目文件介绍(重要):
Ø 运行类:SendBuildResultBuilder.java因为继承了扩展点的类,所以插件运行的时候首先运行的是这个运行类,如图4
Ø Config.jelly:在job中配置该插件,比如说需要配置插件的参数,则必须要写这个文件了
Ø Global.jelly:该插件的全局配置。
Ø *html:jelly文件中属性的帮助文件,。点击插件的“?”即可展示:
l 运行类说明(包括必须方法):
主要介绍编写插件需要注意的事项以及必须要实现的点
Ø 主类必须要继承一个扩展点。我们一般性会使用notifier和builder这两个扩展点,如:
Ø 类属性,类的属性和config.jelly需要的字段对应。并实现set和get方法,:
privateIntegercrid//config.jelly配置
Ø 类的构造函数,本类的构造函数必须加@DataBoundConstructor,并且方法参数为类的属性,需要调用super(),使用@DataBoundConstructor的目的是将config.jelly中的参数与本类绑定。如下:
Ø public boolean perform(AbstractBuild build, Launcherlauncher,BuildListener listener),该方法是必须要override的。方法说明和参数说明如下:
Ø public DescriptorImpl getDescriptor():需要得到这个插件描述信息。如图:
Ø public static final class DescriptorImpl extendsBuildStepDescriptor
这个静态内部类的作用如下:每次保存全局配置的时候,jenkins都会调用该descriptor对象,并调用其onfigure方法,可以实现该方法并提供自己的定制在DescriptorImpl中的configure方法中,可以对全局配置进行操作,save方法用于将当前descriptor所提供的配置持久化(通过get防范)。为了使slave能正常工作,需要提供配置项的get方法;BuildStepDescriptor为插件执行时描述步骤;如图
这个内部类必须要使用的方法如下:
l Jelly说明:
Hudson/Jenkins插件描述文件采用是jelly写法,具体语法请看:https://wiki.jenkins-ci.org/display/JENKINS/Basic+guide+to+Jelly+usage+in+Jenkins
举例说明一下:
说明:
Ø *title:为要显示的标题,
Ø filed:将调用的DescriptorImpl内部类的方法getXXXXX().filed域会将方法去掉get并且将第一个字母小写
Ø description:将显示描述的内容。
l 本地运行
进入workspace,找到插件的位置,使用mvn hpi:run,然后在浏览器中输入http://localhost:8080,使用mvn hpi:run会下载一个jenkins到你的work目录。
l 本地调试
使用mvnDebughpi:run。然后在eclipse设置远程调试
l 远程调试(linux服务器端):
Linux容器需要开启hudson或者jenkins的debug模式,然后和本地调试一样
l 发布hpi
Mvn package 会在你的target生成一个hpi文件,这个文件就是我们需要的,然后将则个文件放入jenkins的plugins目录。重启即可。
https://wiki.jenkins-ci.org/display/JENKINS/Extend+Jenkins---插件
https://wiki.jenkins-ci.org/display/JENKINS/Extension+points---扩展点
https://wiki.jenkins-ci.org/display/JENKINS/Basic+guide+to+Jelly+usage+in+Jenkins-----jelly