360Qtest专栏 火线教你如何开发 Jenkins 插件

Arya · 2017年04月28日 · 最后由 willys 回复于 2017年04月30日 · 3343 次阅读

提到 Jenkins,做测试工作的无论是小伙伴、大伙伴还是老司机都是比较熟悉的。网上大部分资料无非三种:Jenkins 简介、如何启动 Jenkins、如何安装和使用 Jenkins 插件。本文作为一个 jenkins 的进阶:教你如何开发一个 jenkins 插件。话不多说,让我们直接切入正题。如本文题目所示,我会以火线为例,逐步讲述一个 jenkins 插件从无到有的整个过程。有些细心的小伙伴可能就疑惑了,jenkins 我听说过,“火线” 又是个啥呢?由于本文主题是 Jenkins 插件,对于火线的介绍请戳官网介绍。http://magic.360.cn/ 也许你会有意外收获。

1、 工欲善其事,必先利其器。

巧妇还难为无米之炊呢,更何况我们这些程序猿呢?来,先把今天的 “器” 备齐了以便我们之后的冲锋上阵,勇猛杀敌。

1.1 环境:

Maven3、JDK6.0 以上版本、Eclipse(选择自己使用的 IDE 就可以)

1.2 添加 Maven 配置

请将如下配置内容添加到您的 *.m2\settings.xml 配置文件中。

<settings>
  <pluginGroups>
    <pluginGroup>org.jenkins-ci.tools</pluginGroup>
  </pluginGroups>

  <profiles>
    <!-- Give access to Jenkins plugins -->
    <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>
  <mirrors>
    <mirror>
      <id>repo.jenkins-ci.org</id>
      <url>https://repo.jenkins-ci.org/public/</url>
      <mirrorOf>m.g.o-public</mirrorOf>
    </mirror>
  </mirrors>
</settings>
  • 注意:以上各个环境的安装步骤这里不在絮叨,网上一搜,一大丢。如果你是第一次安装使用 Maven,编译项目时需要下载很多依赖包,此时此刻,你可以去洗个头,做个娘娘的发型,美美哒再回来。 # 2、 万事具备,只欠东风。 选择一个你喜欢的开发插件路径。例如我的选择在 FireLine\jenkinsPlugin\ 执行如下 maven 命令:
mvn -U org.jenkins-ci.tools:maven-hpi-plugin:create

运行中间需要输入你的 groupId 和 artifactId,如下图:

完成后会在当前目录下生成 FireLinePlugin 文件目录,此时此刻一个简单的 jenkins 插件模板就光荣诞生啦!!

3、 知其然知其所以然

以上准备工作完成后,即可动手操练起来,开发自己的 jenkins 插件。

3.1 插件项目目录结构

  • src/main/java:存放项目的 java 源码;
  • src/main/resources:存放插件的 Jelly/Groovy 视图文件;
  • src/main/webapp:存放插件的静态资源文件,例如图片、html 文件等。(自动生成插件模板时无此目录,如需添加静态资源可自行创建)。

Jenkins 使用了 Jelly 页面渲染技术,jelly 文件以.jelly 为后缀,在 hudson 中使用类全名的形式来查找模型类对应的 jelly 页面文件,例如名为 src/main/java/com/qihoo/fireline/FireLineBuilder.java 的类,其对应的页面文件应该存在于 src/main/resources/com/qihoo/fireline/FireLineBuilder/目录下。如下图:

resources 文件中的 config.jelly 文件为 job 配置的视图文件,如图:

global.jelly 文件为 jenkins 插件的系统全局配置视图文件,如图:

3.2 生成 eclipse 项目

如果你的 Eclipse 开发环境未安装 Maven 插件,可以使用命令 mvn eclipse:eclipse 将 maven 项目转化成 eclipse 项目直接导入。若已安装 maven 插件,直接导入 maven 项目。使用 maven 命令创建插件会自动生成类文件 HelloWorldBuilder.java,此处我将类名更改成 FireLineBuilder。

3.3 代码详解

本模板中使用了 jenkins 的 Builder 作为扩展点,Jenkins 中有多种不同扩展点,你也可以创建一个新的扩展点。
详情可参考:https://wiki.jenkins-ci.org/display/JENKINS/Extension+points
FireLineBuilder 类中通过@DataBoundConstructor注释来声明构造函数,构造函数参数与 config.jelly 配置文件中的字段一一对应。
在 Jenkins 中,job 每次执行编译时,都会执行 perform() 方法,可在此方法内实现自己的插件定义。方法中有四个参数:

  • build:描述任务的一次构建,通过该对象可获取到当前构建的项目、工作空间、当前构建的执行结果等信息。
  • workspace:当前构建的工作路径。
  • launcher:用来启动构建。
  • listener:监控构建过程的状态。
  • 注意:通过 build 对象可以获取到 jenkins 的构建路径,workspace 获取的是构建项目的工作路径,此处注意区分。 在类 FireLineBuilder 中有个 DescriptorImpl 的内部实现类,其必须使用@extension来声明。可通过 DescriptorImpl 来处理全局系统配置,例如设置插件在项目构建配置中显示的名称等。 java public String getDisplayName() { return "Execute FireLine"; } 显示如图:

通过 DescriptorImpl 类中 FormValidation doCheckName(@QueryParameter String value) 方法可以对 *.jelly 配置中传递的参数进行基本的校验。

  • 注意:doCheck 方法需要与配置中参数名称一一对应。(还有其他方式来校验参数,详情可查看官网) ## 3.4 debug 插件 在项目目录下运行如下命令: > set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n > mvn hpi:run 在浏览器中访问http://localhost:8080/Jenkins ,即可查看调试插件。
  • 注意:如果修改 resources 和 webapp 中的内容,刷新页面即可看到最新修改,若修改了 java 源文件,需要重新编译,才能更新到最新的修改。 ## 3.5 打包并部署自定义插件 执行 mvn 命令 mvn package。打包完成后,在根目录下的 target 文件目录下会生成 firelineplugin.hpi 插件安装包。将 firelineplugin.hpi 安装到 jenkins 中即可使用自定义插件。 安装 jenkins 自定义插件有两种方式: (1) 终止 Jenkins,将 firelineplugin.hpi 拷贝到 $JENKINS_HOME/plugins 目录下并新建一个名为 firelineplugin.hpi.pinned 的空文件。重启 Jenkins。 (2) 打开 jenkins 页面到 “系统管理”“管理插件”“高级”,上传 firelineplugin.hpi 插件重启 Jenkins。

更多干货,扫码关注 Qtest 公众号

共收到 2 条回复 时间 点赞

我来占个坑

—— 来自 TesterHome 官方 安卓客户端

保持队形,💃 💃 💃

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册