JDK版本要求在1.6以上,Maven官方要求版本在3以上,此处本人使用的是JDK1.8 maven3.5.2
然后呢就是你maven的 setting.xml(此setting文件直接放在了C:\Users\xie_7\.m2下)文件要变成这样:
E:\Jenkins\jar
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
安装:去https://jenkins.io/官方下载jenkins的通用war包:
下载可能会很慢,完了之后呢,就把它网自己喜欢的地方copy,然后直接使用java -jar 运行就行,不过在这里需要重点提到的是Jenkins的工作目录默认是在 当前系统用户目录下的.jenkins目录下,这个一定得记住,当然你可以通过配置 JENKINS_HOME 环境变量来进行更改:
好了,关于Jenkins的使用怎么就不去做过多解释了,网上多得是,此处阅读推荐:
https://blog.csdn.net/shuizhihun07/article/details/80168076
要开发插件首先就是 创建插件项目 如果你使用的Jenkins 和我的版本不同的话 创建项目的方式也会有所区别,推荐按以下方式操作:
创建 插件程序 出现了错误,提示 mvn hpi:create 已经过期了,让我们使用
mvn archetype:generate -Dfilter=io.jenkins.archetypes: 方式去创建,然后我们去运行以下:
jenkins提供给了我们五种 模板 :
1、空插件(Jenkins插件的框架)
2、全局配置插件(具有POM和全局配置示例的Jenkins插件的框架)
3、全局共享库
4、hello-world-plugin(带有POM的Jenkins插件的骨架和一个示例构建步骤)
5、脚本管道
我们选择第四项,下面就会让你选择这么 模板 的版本我们选择最新的就行了,然后就是输入ArtifactId 和创建Maven项目一样GroupId呢这里就不能设置了,在Jenkins的老版本是可以设置的。
再然后呢就是设置 version 指定插锁创建插件的版本,这里还是使用默认的,直接 Enter 就行,最后确认 信息输入 y 回车,第一次创建可能会花一点时间在 下载 驱动程序上面,后面就会比较快了,耐心等待!!!
额,这样在我的 E盘 根目录下就生成了我的 JenkinsPlug 插件项目(大写的尴尬,创建了目录忘记cd进去再执行创建命令了)。
首先说明 其实Jenkins提供了 直接使用Eclipse(IntelliJ IDEA)进行创建Jenkins插件项目的工具,但需要进行集成,这里为了方便就直接使用cmd的形式创建滴,有兴趣的可以直接去 https://jenkins.io/doc/developer/development-environment/ 官方有详细介绍!
1)、将JenkinsPlug导入Eclipse工程:
右键选择 import导入工程,然后:
然后Root Directory 输入或选择到 E:\JenkinsPlug 目录,最后Finish,OK。
2)、项目结构详解
三个目录,第一个放 java类,第三个目录实现不存在,需要我们手动去创建,是用来存放静态资源(js/css之类),最后我们来介绍 src/main/resources 目录,这个目录就高级了,先上图:
src/test/java目录下测试文件报错删掉即可,不必理会!还有就是导入项目可能也会话费一定时间!
首先 src/main/java 下的io.jenkins.plugins.sample 包中有 HelloWorldBuilder.java 文件,src/main/resources 下呢有io/jenkins/plugins/sample/HelloWorldBuilder 目录与之对应,这是Jenkins的规则,如果存在HelloWorldBuilder.java就必须存在HelloWorldBuilder目录与之对应,目录路径必须同HelloWorldBuilder.java包名一致。
我们Ctrl + r ==》cmd 然后到 E:\Jenkins路径下 执行 mvn hpi:run 运行插件,记住先删除 .jenkins 目录或者现更改 JENKINS_HOME 变量的值为另外一个目录。访问:http://localhost:8080/jenkins/ 选择 创建一个新任务==》随意输入project名称+选择自由风格软件项目+OK==》之后会进入项目配置页面看到:
然后我们再来看HelloWorldBuilder目录,他下面有三类文件,config.jelly、*.properties、*.html ,观察 这些文件里面的内容你会发现 html对应的就是 上面的 帮助页面(单击问号后出现的),config.jelly就是整个的表单界面,properties是表单界面需要用到的属性配置,在HelloWorldBuilder同级下的其它*.properties则是校验后是需要输出的信息配置文件。
整个config.jelly使用的是jelly开发的,然后再看HelloWorldBuilder.java:
@DataBoundConstructor
public HelloWorldBuilder(String name) {
this.name = name;
}
/**
* We'll use this from the config.jelly.
*/
public String getName() {
return name;
}
类中的name属性映射了config.jelly 中
注意:
下面就是对Builder提供的几个重要方法的介绍,知道这些方法能让你更好的进行开发:
/*perform 真正开始执行的地方 你所有构建时的任务都将在此内完成
* 在此之内你可以执行 任意想执行的业务操作,Web Service等
*/
public void perform(Run, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
if (useFrench) {
listener.getLogger().println("Bonjour, " + name + "!");
} else {
listener.getLogger().println("Hello, " + name + "!");
}
}
@Symbol("greet")
@Extension //通过此注解 告诉系统该内部类是作为BuildStepDescriptor的扩展出现
public static final class DescriptorImpl extends BuildStepDescriptor {
/*
* 对页面传来的参数进行校验,第一个参数为 传来的值,第二个 是否通过校验
*/
public FormValidation doCheckName(@QueryParameter String value, @QueryParameter boolean useFrench)
throws IOException, ServletException {
if (value.length() == 0)
return FormValidation.error(Messages.HelloWorldBuilder_DescriptorImpl_errors_missingName());
if (value.length() < 4)
return FormValidation.warning(Messages.HelloWorldBuilder_DescriptorImpl_warnings_tooShort());
if (!useFrench && value.matches(".*[éáàç].*")) {
return FormValidation.warning(Messages.HelloWorldBuilder_DescriptorImpl_warnings_reallyFrench());
}
return FormValidation.ok();
}
@Override
public boolean isApplicable(Class extends AbstractProject> aClass) {
return true;
}
@Override
public String getDisplayName() {
return Messages.HelloWorldBuilder_DescriptorImpl_DisplayName();
// return "对应页面上选择增加构建步骤时所显示的值,默认为 Say hello world";
}
}
在DescriptorImpl中可自定义方法,然后在对应的jelly文件中通过${descriptor.getLanguageNames()}进行引用,如:(实例中的forEach、if标签可参考官方解释,一html中无异。)
在这里再补充如下几点:
一、在jelly中使用List:
在DescriptorImpl内部类中定义:
直接在定义全局方法:
个人建议在两者中都进行定义,以避免出现空数据的问题!!
*.jelly使用迭代Map:
三、*.jelly中引入js、css
${it.projectName}
、
${resURL}:获取主目录地址。
四、开发遇到的坑
① pom文件找不到jar包并且尝试连网maven update依旧无效,检查是否项目使用时使用的maven jenkins 命令按步骤生成,在生成过程中会修改本地仓库;
② jelly页面取值为空,检查类中和DescriptorImpl内部类中是否有定义同名的GET方法,如果全局属性取不到值,检查是否有定义getting、setting方法,jelly采用此种方式进行的取值赋值;
③ 项目无缘无故报红色叉叉,请手动重新编译项目;
④ *.jelly文件存放的路径必须和Builder类完全路径名一致。
⑤ 注意需要引入的库,不然标签会失效
总结:因为工作的原因文章写得有点断断续续的,但个人认为还是比大多数文章要完整一线,有什么问题的话可以留言,看都会回复的。然后后期如果发现有什么错误,笔者也会进行修改,最后希望对有Jenkins插件开发有需求的程序猿有所帮助!