一、环境依赖

 JDK版本要求在1.6以上,Maven官方要求版本在3以上,此处本人使用的是JDK1.8 maven3.5.2

环境环境

 然后呢就是你maven的 setting.xml(此setting文件直接放在了C:\Users\xie_7\.m2下)文件要变成这样:

<?xml version="1.0" encoding="UTF-8"?>

<settings>
<!-- 指定本地仓库的存放地址,可选 -->
<localRepository>E:\Jenkins\jar</localRepository>
 <!-- 下面的东西都不用管知道不,只需要copy就ok -->
  <pluginGroups>
    <pluginGroup>org.jenkins-ci.tools</pluginGroup>
  </pluginGroups>
  <profiles>
    <!-- Give access to Jenkins plugins -->
    <profile>
      <id>jenkins</id>
      <activation>
        <activeByDefault>true</activeByDefault> <!-- change this to false, if you don't like to have it on per default -->
      </activation>
      <repositories>
        <repository>
          <id>repo.jenkins-ci.org</id>
          <url>http://repo.jenkins-ci.org/public/</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>repo.jenkins-ci.org</id>
          <url>http://repo.jenkins-ci.org/public/</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <mirrors>
    <mirror>
      <id>repo.jenkins-ci.org</id>
      <url>http://repo.jenkins-ci.org/public/</url>
      <mirrorOf>m.g.o-public</mirrorOf>
    </mirror>
  </mirrors>
</settings>

安装:去https://jenkins.io/官方下载jenkins的通用war包:

Jenkins下载

 下载可能会很慢,完了之后呢,就把它网自己喜欢的地方copy,然后直接使用java -jar 运行就行,不过在这里需要重点提到的是Jenkins的工作目录默认是在 当前系统用户目录下的.jenkins目录下,这个一定得记住,当然你可以通过配置 JENKINS_HOME 环境变量来进行更改:

配置 JENKINS_HOME

 

 

二、插件开发

    1.创建 插件程序

    好了,关于Jenkins的使用怎么就不去做过多解释了,网上多得是,此处阅读推荐:

    https://blog.csdn.net/shuizhihun07/article/details/80168076

    要开发插件首先就是 创建插件项目 如果你使用的Jenkins 和我的版本不同的话 创建项目的方式也会有所区别,推荐按以下方式操作:

     创建 插件程序 出现了错误,提示 mvn hpi:create 已经过期了,让我们使用 

mvn archetype:generate -Dfilter=io.jenkins.archetypes:  方式去创建,然后我们去运行以下:

创建maven插件项目

    jenkins提供给了我们五种 模板 :

1、空插件(Jenkins插件的框架)

2、全局配置插件(具有POM和全局配置示例的Jenkins插件的框架)

3、全局共享库

4、hello-world-plugin(带有POM的Jenkins插件的骨架和一个示例构建步骤)

 5、脚本管道

     我们选择第四项,下面就会让你选择这么 模板 的版本我们选择最新的就行了,然后就是输入ArtifactId 和创建Maven项目一样GroupId呢这里就不能设置了,在Jenkins的老版本是可以设置的。

     再然后呢就是设置 version 指定插锁创建插件的版本,这里还是使用默认的,直接 Enter 就行,最后确认 信息输入 y 回车,第一次创建可能会花一点时间在 下载 驱动程序上面,后面就会比较快了,耐心等待!!!

     额,这样在我的 E盘 根目录下就生成了我的 JenkinsPlug 插件项目(大写的尴尬,创建了目录忘记cd进去再执行创建命令了)。

2.使用Eclipse开发插件

  首先说明 其实Jenkins提供了 直接使用Eclipse(IntelliJ IDEA)进行创建Jenkins插件项目的工具,但需要进行集成,这里为了方便就直接使用cmd的形式创建滴,有兴趣的可以直接去 https://jenkins.io/doc/developer/development-environment/ 官方有详细介绍!

  1)、将JenkinsPlug导入Eclipse工程:

     右键选择 import导入工程,然后:

然后Root Directory 输入或选择到 E:\JenkinsPlug 目录,最后Finish,OK。

2)、项目结构详解

  • src/main/java
  • src/main/resources
  • src/main/webapp

三个目录,第一个放 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 <tt>config.jelly</tt>.  
 */   
public String getName() {   
	return name;   
}  

 类中的name属性映射了config.jelly 中 <f:entry title="${%Name}" field="name"> 的field属性,当执行这个项目的构建操作时在 HelloWorldBuilder.java 就会获得页面的name值,也就是存在关联关系。如此我们你就能得到.jelly中想要的值,并且也能在类中对参数进行校验。

注意:<f:*/>(*代表泛指)标签中的field通过类中属性的get方法进行绑定。

下面就是对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<Builder> {
    	
    	/*
    	 * 对页面传来的参数进行校验,第一个参数为 传来的值,第二个 是否通过校验
    	 */
        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:

二、两种方式定义jelly标签数据与Map集合使用

DescriptorImpl内部类中定义:

直接在定义全局方法:

个人建议在两者中都进行定义,以避免出现空数据的问题!!

*.jelly使用迭代Map:

三、*.jelly中引入js、css

<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:l="/lib/layout" xmlns:st="jelly:stapler">
	<l:layout title="伪页面">
		<l:side-panel>
			<st:include page="sidepanel.jelly" it="${it.run}" optional="true"/>
		</l:side-panel>
		<l:main-panel>
			<link rel="stylesheet" href="${resURL}/plugin/CodesecJenkinsPlugin/view.css"/>
			<script type="text/javascript" src="${resURL}/plugin/CodesecJenkinsPlugin/jquery.min.js"></script>
			<script type="text/javascript" src="${resURL}/plugin/CodesecJenkinsPlugin/echarts.common.min.js"></script>
			<script type="text/javascript" src="${resURL}/plugin/CodesecJenkinsPlugin/echartsOne.js"></script>
			<j:if test="${it.isSize}">
				<div class="myTitle">
					<span class="myS">${it.projectName}</span>
				</div>、

		</l:main-panel>
	</l:layout>
</j:jelly>

${resURL}:获取主目录地址。

四、开发遇到的坑

      ① pom文件找不到jar包并且尝试连网maven update依旧无效,检查是否项目使用时使用的maven jenkins 命令按步骤生成,在生成过程中会修改本地仓库;

      ② jelly页面取值为空,检查类中和DescriptorImpl内部类中是否有定义同名的GET方法,如果全局属性取不到值,检查是否有定义getting、setting方法,jelly采用此种方式进行的取值赋值;

      ③ 项目无缘无故报红色叉叉,请手动重新编译项目;

      ④ *.jelly文件存放的路径必须和Builder类完全路径名一致。

     ⑤ 注意需要引入的库,不然标签会失效

总结:因为工作的原因文章写得有点断断续续的,但个人认为还是比大多数文章要完整一线,有什么问题的话可以留言,看都会回复的。然后后期如果发现有什么错误,笔者也会进行修改,最后希望对有Jenkins插件开发有需求的程序猿有所帮助!

Logo

欢迎加入西安开发者社区!我们致力于为西安地区的开发者提供学习、合作和成长的机会。参与我们的活动,与专家分享最新技术趋势,解决挑战,探索创新。加入我们,共同打造技术社区!

更多推荐