使用脚手架创建插件项目
安装 JDK Maven 并配置 Maven 仓库 settings.xml
<settings>
<pluginGroups>
<pluginGroup>org.jenkins-ci.tools</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>jenkins</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/public/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</settings>
使用脚手架创建项目
mvn archetype:generate -B -DarchetypeGroupId=io.jenkins.archetypes -DarchetypeArtifactId=hello-world-plugin -DhostOnJenkinsGitHub=true -DarchetypeVersion=1.7 -DartifactId=hello-world-plugin
运行,注意需要在 pipeline 下测试插件,jenkins 需要先安装 pipeline 插件
mvn hpi:run
打包插件并安装
mvn package
生成一个 hpi 文件,直接在 jenkins 后台上传即可。
开发
Jenkins 插件开发就是对于一系列的「扩展点」进行扩展实现自定义的功能。
扩展点 ExtensitionPoint
扩展点是 Jenkins 系统某个方面的接口或抽象类。这些接口定义了需要实现的方法,而 Jenkins 插件就需要实现这些方法,比如我写的插件需要实现 Builder
这个扩展点:
public class MavenCheck extends Builder {}
Descriptor 静态内部类
Descriptor
静态内部类是一个类的描述者,用于指明这是一个扩展点的实现,Jenkins 通过这个描述者才能知道我们写的插件。每一个描述者静态类都需要呗 @Extension
注解,Jenkins 内部会扫描 @Extension
注解来获取注册了哪些插件:
@Extension
public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {
public DescriptorImpl() {
load();
}
// 表示这个 Builder 在 Jenkins Project 是否可用
@Override
public boolean isApplicable(Class<? extends AbstractProject> aClass) {
return true;
}
// 用于在 Jenkins 页面上的显示
@Override
public String getDisplayName() {
return "Maven SNAPSHOT Check";
}
}
数据的绑定
@DataBoundConstructor
注解作用于构造器上,用于在页面上配置的插件参数
...
@DataBoundConstructor
public MavenCheck(boolean check) {
this.check = check;
}
Jenkins 插件的页面使用 jelly
, 一个正常的插件可以分成 3 个 jelly
文件:
- index.jelly: 代表此插件的概要描述,可以在插件列表中看到;
- global.jelly: 代表此插件的全局配置;
- config.jelly: 代表此插件在单个 job 中的配置;
请注意 config.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:entry title="check" field="check">
<f:checkbox />
</f:entry>
</j:jelly>