目录
一、本地搭建
1.修改maven配置文件
2.下载插件模板
3.本地运行项目
二、项目体系
1.项目体系图
2.项目代码描述
三、开发扩展
1.内部插件
2.外部插件
概要:Jenkins是一种持续集成工具,同时也是一个强大的插件系统。使用插件,几乎可以影响到所有的jenkins操作。Jenkins 目前有超过 1500 个社区插件,用于支撑整个持续集成流程。除此之外,我们自己还能按需开发插件。本节内容主要面向jenkins插件的开发。
描述:本地搭建插件开发项目的完整流程。
搭建流程图:
org.jenkins-ci.tools
jenkins
true
repo.jenkins-ci.org
https://repo.jenkins-ci.org/public/
repo.jenkins-ci.org
https://repo.jenkins-ci.org/public/
repo.jenkins-ci.org
https://repo.jenkins-ci.org/public/
m.g.o-public
作用:通过配置的仓库地址或节点下载需要的文件。
如果没配置,则可能出现这种结果(maven无法找到文件并构建项目):
命令:mvn archetype:generate -Dfilter=io.jenkins.archetypes:plugin
|
1.运行项目:mvn hpi:run
启动项目:
|
2.远程调试项目
设置环境变量(windows):set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n
配置远程监听:
之后,通过 mvn hpi:run 启动项目,然后通过idea启动debug,显示连接上socket即可
|
描述:插件的内部处理过程。
|
全局配置:
public class SampleConfiguration extends GlobalConfiguration {
...
@DataBoundSetter
public void setLabel(String label) {
this.label = label;
save();//通过调用save()方法保存全局变量值,他的作用是把配置放置在根目录下的通文件名的xml文件里。
}
}
项目配置:
//继承build表构建时处理。
//build中有实现两个接口
//ExtensionPoint(插件开发扩展点):作用是标识它是扩展的插件,以便Jenkins自动发现,也能通过@hudson.Extension注解来注册
//Describable:作用是实现它的类将会产生全局唯一实例,让其实现类可以通过getDescriptor()取到对应实例。
public class HelloWorldBuilder extends Builder implements SimpleBuildStep {
private final String name;
private final String name2;
private boolean useFrench;
//参数赋值,并将参数保存到项目下xml文件中
@DataBoundConstructor
public HelloWorldBuilder(String name,String name2) {
this.name = name;
this.name2 = name2;
}
public String getName2() {
return name2;
}
public String getName() {
return name;
}
public boolean isUseFrench() {
return useFrench;
}
//同上
@DataBoundSetter
public void setUseFrench(boolean useFrench) {
this.useFrench = useFrench;
}
/**
* 核心方法,表示在step过程中将会执行此操作,这是插件开发过程中的主要作用区
* @param run 当前步骤属于step
* @param workspace 工作区
* @param launcher 用于启动进程
* @param listener 监听并发送输出
* @throws InterruptedException
* @throws IOException
*/
@Override
public void perform(Run, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
//构建时增加Jelly视图
run.addAction(new HelloWorldAction(name));
if (useFrench) {
listener.getLogger().println("Bonjour, " + name + "!");
} else {
listener.getLogger().println("Hello, " + name + "!");
}
}
@Symbol("greet")//类的扩展标识符,可以在pipeline通过该标识符调用该扩展类
@Extension//声明为插件扩展标识
public static final class DescriptorImpl extends BuildStepDescriptor {
/**
* 表示对字段"name"做检查,"name"被填写时将会被调用,它的内部通过抽象父类Descriptor执行方法getCheckMethod(String fieldName) ,内部通过反射找到参数名称对应方法。
* @param value 传入参数"value"表示字段"name"传入的值
* @param useFrench 而后的参数useFrench是传入的同名字段的值
* @throws IOException
* @throws ServletException
*/
public FormValidation doCheckName(@QueryParameter String value, @QueryParameter boolean useFrench)
throws IOException, ServletException {
System.out.println("value:"+value);
System.out.println("useFrench:"+useFrench);
if (value.length() == 0)
return FormValidation.error("value.length() == 0");
if (value.length() < 4)
return FormValidation.warning("value.length() < 4");
if (!useFrench && value.matches(".*[éáàç].*")) {
return FormValidation.warning("else");
}
return FormValidation.ok();
}
//判断当前Step是否能用于目标类型的项目
@Override
public boolean isApplicable(Class extends AbstractProject> aClass) {
return true;
}
//这个步骤的名称
@Override
public String getDisplayName() {
return "插件开发helloworld";
}
}
}
|
描述:Jenkins自身提供可供实现的插件。
官网地址: https://jenkins.io/doc/developer/extensions/jenkins-core/
描述:一部分已经实现的插件,可供二次开发。
官网地址: https://jenkins.io/doc/developer/extensions
内容很多,但不是很完整,有些插件连github地址都已经丢失了。
案例:
Jenkins Jira Plugin作用之一:Jenkins构建页面的后处理来更新Jira问题
参考文档:
官网:
https://jenkins.io/doc/developer/extensions/
https://jenkins.io/doc/developer/extensions/jenkins-core/
https://wiki.jenkins.io/display/JENKINS/Defining+a+new+extension+point
https://jenkins.io/doc/developer/tutorial/extend/
博客:
https://juejin.im/post/599bdddb6fb9a0248e5cb45f
https://blog.csdn.net/weixin_38652136/article/details/81116455
https://blog.gmem.cc/jenkins-plugin-development
https://blog.csdn.net/weixin_38652136/article/details/81116455
若有错误,还望指出