Jenkins做为一款开源的持续集成工具,在平常的开发、集成、部署等环节中应用十分普遍。Jenkins的环境搭建和配置就很少说了,网上有不少相关资料,整体使用流程也很是简单。Jenkins的一大特色就是基于插件的高可扩展性,在使用过程当中咱们能够发现,Jenkins的许多功能都是经过插件进行集成的,例如php
在常规使用过程当中,一些基本的插件就能够知足要求,但总有那么些奇怪的要求不能很快的找到对应的插件,那就须要本身开发了。html
安装JDK和maven,添加环境变量,增长maven配置java
<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>
复制代码
官方的插件开发插件:连接。具体步骤以下:python
mvn -U hpi:create
复制代码
cd plugin-name(artifactId)
mvn verify
复制代码
mvn hpi:run
复制代码
mvnDebug hpi:run
复制代码
官方提供了一个样例教程:Extend the Plugin,样例介绍了如何开发一个继承自Action的组件,并显示在job运行状态页面的侧边栏上。shell
官方还有相关的API文档:文档。api
固然整体来讲相关的插件开发文档并不算不少,接下来就以两个实际的需求场景来说解一下Jenkins插件的开发。bash
对于这样一个需求,是否须要额外开个端口响应请求呢?Jenkins有没有这样的扩展方式呢? 答案是确定的,Jenkins官方提供了Remote Access API相关功能及扩展。官方文档中提到了Jenkins自带的一些Remote Access API,那如何自定义一个API呢?具体步骤以下:服务器
public class HookPlugin extends Plugin {
public Api getApi() {
return new HookApi(this);
}
}
复制代码
public class HookApi extends Api {
@WebMethod(name = "pull_request_build")
public void doPullRequestBuild(StaplerRequest req, StaplerResponse resp) throws IOException {
// do something
}
}
复制代码
到此为止,一个接口就开发完成了,过程至关简单。接口地址为{jenkins_host}/plugin/{plugin-name}/api/pull_request_build,其中plugin-name就是前文中建立插件时输入的artifactId。maven
public class IMNotifier extends Notifier {
private final String user;
@DataBoundConstructor
public IMNotifier(String user) {
this.user = user;
}
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
// do something
}
// 使用自定义的Descriptor
@Override
public DescriptorImpl getDescriptor() {
return (DescriptorImpl) super.getDescriptor();
}
@Extension
public static final class DescriptorImpl extends BuildStepDescriptor<Publisher> {
@Override
public boolean isApplicable(Class<? extends AbstractProject> aClass) {
return true;
}
@Override
public String getDisplayName() { // 插件在界面上展现的名字
return "IM Notification";
}
public FormValidation doCheckDefaultUser(@QueryParameter String value) { // 对输入框进行校验
if (value.length() == 0) {
return FormValidation.error("Please set a user");
}
return FormValidation.ok();
}
}
}
复制代码
因此在这个需求中,咱们须要修改config.jelly,添加一个输入框,具体代码以下,须要注意其中field要和IMNotifier中的参数名一致,jelly文件的位置也须要和IMNotifier文件的位置相匹配。ide
<?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="User" field="user">
<f:textbox />
</f:entry>
</j:jelly>
复制代码
插件功能开发完成后就可使用如下命令进行编译:
mvn clean install
复制代码
编译完成后会生成一个hpi文件,手动上传到jenkins服务器安装便可。
从上文的两个样例来看,Jenkins插件并不复杂,其中的关键点在于找到系统相关的API做为切入点。例如Builder是构建过程,Notifier是构建后过程,远程接口就要继承Plugin等等。官方有一个扩展点的文档能够进行参考:扩展文档。开发过程当中能够根据实际需求在任何扩展点进行扩展。