`

Hudson 插件编写

 
阅读更多

Hudson是一个开源的持续集成工具,由于其强大的扩展性(插件)而著名,允许用户定制build的各个step,steps如下:

  • SCM checkout - Based on SCM type, source code is checked out
  • Pre-build - Invoked to indicate that the build is starting
  • Build wrapper - Prepare an environment for the build.
  • Builder runs - Actual building like calling Ant, Make, etc. happen.
  • Recording - Record the output from the build, such as test results.
  • Notification - Send out notifications, based on the results determined so far
下面主要介绍怎么新建一个简单的hudson插件以及插件中的主要代码功能

1、新建一个简单hudson插件
1.1 ~/.m2/settings.xml文件中增加pluginGroup,如下:
<pluginGroups>
	……
    <pluginGroup>org.jvnet.hudson.tools</pluginGroup>
	……
</pluginGroups>
加入这一行信息可以在我们使用Hudson的maven插件时使用缩略名(比如.使用hpi:create代替org.jvnet.hudson.tools:maven-hpi-plugin:1.23:create)
 
1.2 新建工程
使用如下命令
mvn hpi:create
hpi: 是Hudson Plug-in Interface的缩写,这是Hudson自己开发的用来进行插件开发的maven插件,就像大家经常用的mvn eclipse:eclipse中的前面一个eclipse
create:这是Hudson HPI插件用来生成Hudson插件原型项目的goal
关于mvn相关概念可以参考:http://trinea.iteye.com/blog/1290898

过程中会提示输入groupId和artifactId,输入自己的即可
这样一个HelloWorldBuilder就已经创建好了,导入eclipse可以查看源码

这里有点需要注意,貌似hudson默认构建的Builder代码有问题,大家可以自己试下, 我这边需要在HelloWorldBuilder类中加入如下代码方能正确得到结果,否则在1.5步中的配置时无法看见新添加的builder。
 public static DescriptorImpl descriptor() {
        return Hudson.getInstance().getDescriptorByType(HelloWorldBuilder.DescriptorImpl.class);
    }
以上代码中的HelloWorldBuilder为当前类名

1.3 打包
命令如下:
mvn package
在target目录下生成了一个*.hpi和一个*.jar文件,见过hudson插件的都知道,hpi后缀为hudson插件文件。现在我们就可以将hpi文件添加到hudson中作为插件,不过不急,我们用命令自动运行

1.4 运行
命令如下:
mvn hpi:run
这个命令会启动jetty,并且将hudson作为一个web应用启动,启动hudson前安装当前的插件到hudson中
当前项目根目录下的work文件夹作为hudson home,可以在其中找到用于存放插件的plugins文件夹

1.5 查看结果
项目成功启动、jetty成功启动后我们可以通过
http://localhost:8080
访问hudson主页,其中8080为jetty启动默认端口,若端口被占用,可以在上面运行命令中添加参数指定端口,如下
mvn hpi:run -Djetty.port=8090
修改启动端口为8090

在hudson主页左边菜单栏有新建任务菜单,点击新建工程,选择构建一个自由风格的软件项目,输入名称后ok即可。之后就进入新建的项目配置中。
配置的Build区域,点击Add build step,打开下拉菜单我们可以看见Say hello world这个Builder。这个就是我们的插件。Say hello world为插件中设置的显示名。选中这个Builder,填入name保存后,点击菜单栏的立即构建开始运行。在结果的命令行输出中会输出Hello, 加上我们刚才输入的name。

到此一个简单的插件就完成了,下面介绍下代码

2、插件中主要代码介绍

2.1 继承相应的扩展点extension Point

hpi中有个概念叫extension Point。就是说你要扩展哪方面。

由于mvn hpi:create默认扩展自扩展Builder这个扩展点,所以HelloWorldBuilder继承了Builder这个类。

其他扩展点会继承其他类,如post build action需要继承Notifier

 

2.2 实现perform方法

方法perform()是个很重要的方法,当插件运行的的时候这个方法会被调用。相应的业务逻辑也可以在这里实现。

 

2.3 继承Descriptor

新建DescriptorImpl类继承了BuildStepDescriptor<Builder>,BuildStepDescriptor继承自Descriptor。在Hudson 的官方说明文档里说Descriptor包含了一个配置实例的元数据。

打个比方,我们在工程配置那里对插件进行了配置,这样就相当于创建了一个插件的实例,这时候就需要一个类来存储插件的配置数据,这个类就是Descriptor。

 

其中的getDisplayName()表示在配置中插件展现的名字,如同上面1.5查看结果中我们看到的配置中build下拉框的Say hello world

 

3、debug调试

用mvn -Dhudson.maven.debugPort=5001 hpi:run启动jetty

或者修改maven启动参数

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=5001

具体见:http://wiki.hudson-ci.org/display/HUDSON/Debugging+native+Maven+jobs

 

更多参考如下:

http://wiki.hudson-ci.org/display/HUDSON/Extend+Hudson

http://wiki.eclipse.org/Hudson-ci/writing-first-hudson-plugin

http://wiki.hudson-ci.org/display/HUDSON/Plugin+tutorial

http://qa.taobao.com/?p=4925

http://drizzlewalk.blog.51cto.com/2203401/499586

分享到:
评论
4 楼 daxiaoli123 2012-08-22  
楼主请加我Q565824237
3 楼 Trinea 2011-12-26  
jackyneo 写道
最近来考虑自己写个插件。。。满足SCM和一帮人的要求,尼玛,又当开发又搞测试,一种又当爹又当妈的感觉。。。

mvn hpi:run -Djetty.port=8090  这个命令是改启动端口的
简单的插件好写,但对于不同的扩展点要实现的函数略有不同,这些文档还不好找,有点麻烦,我们这边有不少扩展点其他人已经写好了的插件,到时候你需要可以找我
2 楼 jackyneo 2011-12-26  
最近来考虑自己写个插件。。。满足SCM和一帮人的要求,尼玛,又当开发又搞测试,一种又当爹又当妈的感觉。。。
1 楼 jackyneo 2011-12-26  
本地调试的时候要确保端口没被调用,否则就悲剧了

相关推荐

    Hudson Jenkins插件相关

    插件是通过Java编写的,可以很容易地在Jenkins管理界面中安装和配置。 2. **源码管理** 在“源码”这个标签下,我们可以理解为Hudson或Jenkins与源代码仓库的交互。通常,开发者会将代码提交到如Git或Subversion...

    hudson插件开发相关链接.zip

    Hudson插件是基于Java编写的小型应用程序,它们扩展了Hudson的功能,使得Hudson能够支持各种构建工具、版本控制系统、测试框架等。在开发过程中,对源码的理解至关重要。通过阅读Hudson的源码,我们可以了解其内部...

    hudson 开发指南

    总结:Hudson开发指南详细介绍了如何从零开始开发Hudson插件,包括理解Hudson的基本概念、插件开发流程、实战技巧以及社区资源。通过学习本指南,开发者能够根据项目需求,定制化的扩展Hudson的功能,提升团队的开发...

    hudson持续集成包

    Hudson 的优势在于其丰富的插件系统,可以方便地与各种版本控制系统、构建工具、测试框架和通知服务集成。 1. **持续集成概念** 持续集成是一种软件开发实践,开发者频繁地将代码变更合并到主分支,通常每天至少一...

    hudson解析

    Hudson 的源码是用Java编写的,这使得它具有跨平台的特性。其源码结构主要分为几个部分: 1. **核心框架**:这是Hudson的基础,提供构建任务调度、插件管理、安全控制等功能。源码中包含了大量的接口和抽象类,方便...

    centos环境hudson自动化部署报告.doc

    2. **JDK安装**:Hudson是用Java编写的,因此需要先安装Java Development Kit (JDK)。可以通过Yum包管理器安装OpenJDK或Oracle JDK,根据项目需求选择合适版本。 3. **Hudson安装**:下载Hudson的WAR文件,将其放置...

    Hudson_CI:PHP持续集成

    - **Hudson插件**:可能需要安装PHP插件以支持PHP构建和测试。 5. **配置Hudson**:在Hudson Web界面中创建新项目,配置源码仓库,设置构建触发器(如提交后自动触发),添加构建步骤(如运行composer install,...

    hudson集成

    ### Hudson集成:实现持续化集成的关键知识点 #### 一、Hudson简介与基本概念 ...通过上述知识点的学习与实践,开发者可以熟练掌握如何利用Hudson搭建一套完整的持续集成环境,从而提高软件开发效率并保证产品质量。

    hudson使用手册

    《Hudson 使用手册》 Hudson 是一个强大的持续集成工具,它的主要功能是自动化软件项目的构建、测试和发布过程,确保开发...通过熟练掌握Hudson的使用,开发者可以更专注于代码编写,而无需担忧构建和测试的繁琐工作。

    freemarker编辑器与eclipse整合插件

    "Freemarker编辑器与Eclipse整合插件"是专门为Eclipse和MyEclipse设计的,目的是为开发者提供一个集成的Freemarker模板编辑环境,便于更好地编写和调试Freemarker模板。 这个整合插件的核心是`hudson.freemarker_...

    hudson.freemarker_ide_0.9.14 高亮

    描述中提到的步骤暗示了如何安装和使用这个插件:“将文件解压缩放到Eclipse的plugins中,去掉只读。重启Eclipse,即可!”这表明插件的安装过程相对简单,只需要将解压后的文件复制到Eclipse的插件目录,并确保文件...

    hudson安装及使用手册

    本手册将帮助用户了解如何在Linux系统上正确地安装和配置Hudson,以及如何利用它进行有效的持续集成。 **一、Hudson简介** Hudson是Java编写的,因此可以在任何支持Java的平台上运行。它提供了一个易于使用的Web...

    Hudson+Maven+SVN 自动部署

    1. **代码提交**:开发者在本地完成代码编写后,使用SVN客户端将更改提交到SVN仓库。 2. **Hudson监听**:Hudson服务器配置为监听SVN仓库,一旦检测到代码更新,就会触发构建过程。 3. **Maven构建**:Hudson调用...

    hudson 使用手册

    - **插件安装示例**:通过具体的插件安装流程来展示如何增强 Hudson 的功能。 #### 5. 使用场景示例 - **SVN 更新与安全设置**:配置 SVN 更新策略和账号权限,确保代码仓库的安全访问。 - **邮件自动发送出错通知*...

    持续集成开发工具Hudson资料收集

    - **跨平台**:由于是用Java编写,Hudson可在任何支持Java的平台上运行。 - **插件丰富**:Hudson提供了大量的插件,支持各种版本控制系统、构建工具、测试框架等。 - **实时反馈**:一旦有代码提交,Hudson会...

    continuous integration with hudson

    Hudson是一个功能强大的持续集成工具,通过其灵活的配置选项和丰富的插件生态系统,可以满足不同规模团队的需求。无论是简单的项目还是复杂的应用程序,Hudson都能够提供稳定可靠的构建和测试环境,帮助企业实现高效...

    基于Hudson的持续集成指南

    - 插件的使用是Hudson的一大特色,通过安装和配置插件,可以实现代码质量检查(如FindBugs、PMD)、单元测试框架(如JUnit)、以及邮件通知等功能。 4. **实际操作** - 本指南可能会详细介绍如何创建新的Hudson...

Global site tag (gtag.js) - Google Analytics