https://wiki.jenkins.io/display/JENKINS/Extend+Jenkins
http://commons.apache.org/proper/commons-jelly/index.html
文档阅读笔记:
- Scm:代表源码管理的一个步骤,如源码管理中的Git,Subversion就是扩展的Scm
- Builder : 代表构建的一个步骤,如增加构建步骤中,我们可以增加一个构建步骤,而每一个选项都是对应一个Builder,在每一个Builder中都有自己不同的功能
- Trigger:代表一个构建的触发,当满足一个什么样的条件时触发这个项目开始构建。比较常用的触发就是当代码变更时触发,如果我们需要实现一些比较复杂的触发逻辑,就需要扩展Trigger这个扩展点
- Publisher:Publisher代表一个项目构建完成后需要执行的步骤,如选项中的E-Mail Notifaction就是一个Publisher插件,选择这个选项后,当项目构建完成,就会使用email来通知用户,假如想要在项目构建完成后将构建目标产物发送到服务器上,则可以扩展此扩展点
在Say Hello World的例子中:
public class HelloWorldBuilder extends Builder implements SimpleBuildStep { }
继承自builder,所以这代表了构建的一个步骤,属于一个构建插件。每一个插件类中都必须要有一个Descriptor内部静态类,它代表一个类的’描述者‘,用于指明这是一个扩展点的实现,Jenkins是通过这个描述者才能知道我们自己写的插件,每一个‘描述者’静态类都需要被@Extension注解,Jenkins内部会扫描@Extenstion注解来知道注册了有哪些插件。
@Extension public static final class DescriptorImpl extends BuildStepDescriptor<Builder> { private boolean useFrench; public DescriptorImpl() { load(); } // 代表我们的插件是否可用 public boolean isApplicable(Class<? extends AbstractProject> aClass) { return true; } // 返回的是一个String类型的值,这个名称会用在web界面上显示的名称(如构建下拉选项中可以看到Say hello world) public String getDisplayName() { return "Say hello world"; } @Override public boolean configure(StaplerRequest req, JSONObject formData) throws FormException { save(); return super.configure(req,formData); } public boolean getUseFrench() { return useFrench; } }
在我们的HelloWorldBuilder中构造函数上有一个注解:
@DataBoundConstructor public HelloWorldBuilder(String name) { this.name = name; }
这个注解的作用是用于参数注入(反射),jenkins将界面上获取的值,传递给这个构造函数。这样插件就能获取到在界面上配置的值了。
视图
global.jelly 全局的配置视图
与config.jelly同一个目录。界面内容会显示在系统配置中
<?jelly escape-by-default='true'?> <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"> <f:section title="Hello World Builder"> <f:entry title="French" field="useFrench" description="Check if we should say hello in French"> <f:checkbox /> </f:entry> </f:section> </j:jelly>
config.jelly Job的配置视图
<?jelly escape-by-default='true'?> <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"> <f:entry title="Name" field="name"> <f:textbox /> </f:entry> </j:jelly>
在定义一个属性时,使用<f:entry>
标签代表这是一个属性,其中title
是指在界面上显示的字段名,而field
是指这个属性在HelloWorldBuilder中对应的属性名,jenkins通过这个名称来与HelloWorldBuilder中的属性相对应,从而使用@DataBoundConstructor
标注的构造函数将这些变量注入到HelloWorldBuilder类中。
help-属性名.html 帮助视图 html片段
当在配置中点击输入框的右边的问号时,下面展开的视图就会显示这个html片段的界面。