`
classtwo5367
  • 浏览: 38700 次
  • 性别: Icon_minigender_1
  • 来自: Cork
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hudson 插件开发 (Part 2: 插件结构解读 I )

阅读更多
经过前一篇文章的步骤,在我们的指定目录下已经生成了一个Hudson 插件的项目文件夹。在Eclipse中导入这个项目,我们可以看见项目有如下的结构:

+ src
    + main
        + java
             +  full.package.name
                    +- HelloWorldBuilder.java
                    +- PluginImpl.java
+resources
             +  full.package.name
                    +- config.jelly
                    +- global.jelly
                +- index.jelly
        + webapp
            +- help-globalConfig.html
            +- help-projectConfig.html

PluginImpl.java:
这个类是用于插件注册扩展点(Extension points)的一个类,在这里,我们注册了一个Builder。其实在Hudson 中有很多不同种类的扩展点,比如Publisher、Recorder 等等。详细的说明可以参考Hudson 的网站。

public class PluginImpl extends Plugin {
    public void start() throws Exception {
       
        BuildStep.BUILDERS.add(HelloWorldBuilder.DESCRIPTOR);
    }
}


HelloWorldBuilder.java
这个类就是具体实现某一扩展点的一个类,在这里由于要扩展Builder这个扩展点,所以继承了 Builder 这个类

public class HelloWorldBuilder extends Builder {

    private final String name;

    @DataBoundConstructor
    public HelloWorldBuilder(String name) {
        this.name = name;
    }

    /**
     * We'll use this from the <tt>config.jelly</tt>.
     */
    public String getName() {
        return name;
    }

    public boolean perform(Build build, Launcher launcher, BuildListener listener) {
        // this is where you 'build' the project
        // since this is a dummy, we just say 'hello world' and call that a build

        // this also shows how you can consult the global configuration of the builder
        if(DESCRIPTOR.useFrench())
            listener.getLogger().println("Bonjour, "+name+"!");
        else
            listener.getLogger().println("Hello, "+name+"!");
        return true;
    }

    public Descriptor<Builder> getDescriptor() {
        // see Descriptor javadoc for more about what a descriptor is.
        return DESCRIPTOR;
    }

    /**
     * Descriptor should be singleton.
     */
    public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();

    /**
     * Descriptor for {@link HelloWorldBuilder}. Used as a singleton.
     * The class is marked as public so that it can be accessed from views.
     *
     * <p>
     * See <tt>views/hudson/plugins/hello_world/HelloWorldBuilder/*.jelly</tt>
     * for the actual HTML fragment for the configuration screen.
     */
    public static final class DescriptorImpl extends Descriptor<Builder> {
        /**
         * To persist global configuration information,
         * simply store it in a field and call save().
         *
         * <p>
         * If you don't want fields to be persisted, use <tt>transient</tt>.
         */
        private boolean useFrench;

        DescriptorImpl() {
            super(HelloWorldBuilder.class);
        }

        /**
         * Performs on-the-fly validation of the form field 'name'.
         *
         * @param value
         *      This receives the current value of the field.
         */
        public void doCheckName(StaplerRequest req, StaplerResponse rsp, @QueryParameter final String value) throws IOException, ServletException {
            new FormFieldValidator(req,rsp,null) {
                /**
                 * The real check goes here. In the end, depending on which
                 * method you call, the browser shows text differently.
                 */
                protected void check() throws IOException, ServletException {
                    if(value.length()==0)
                        error("Please set a name");
                    else
                    if(value.length()<4)
                        warning("Isn't the name too short?");
                    else
                        ok();

                }
            }.process();
        }

        /**
         * This human readable name is used in the configuration screen.
         */
        public String getDisplayName() {
            return "Say hello world";
        }

        public boolean configure(StaplerRequest req, JSONObject o) throws FormException {
            // to persist global configuration information,
            // set that to properties and call save().
            useFrench = o.getBoolean("useFrench");
            save();
            return super.configure(req);
        }

        /**
         * This method returns true if the global configuration says we should speak French.
         */
        public boolean useFrench() {
            return useFrench;
        }
    }
}


是不是看得有点头晕,呵呵,下面我来逐步分析这些代码

@DataBoundConstructor
    public HelloWorldBuilder(String name) {
        this.name = name;
    }

    /**
     * We'll use this from the <tt>config.jelly</tt>.
     */
    public String getName() {
        return name;
    }

这段代码用于构造这个Bulider并且从相应的config.jelly中获取相应的参数。Hudson使用了一种叫structured form submission的技术,使得可以使用这种方式活动相应的参数。

public boolean perform(Build build, Launcher launcher, BuildListener listener) {
        // this is where you 'build' the project
        // since this is a dummy, we just say 'hello world' and call that a build

        // this also shows how you can consult the global configuration of the builder
        if(DESCRIPTOR.useFrench())
            listener.getLogger().println("Bonjour, "+name+"!");
        else
            listener.getLogger().println("Hello, "+name+"!");
        return true;
    }

方法perform()是个很重要的方法,当插件运行的的时候这个方法会被调用。相应的业务逻辑也可以在这里实现。比如这个perform()方法就实现了怎么说 “Hello”

接下来,在HelloBuilder 这个类里面有一个叫 DescriptorImpl 的内部类,它继承了Descriptor。在Hudson 的官方说明文档里说Descriptor包含了一个配置实例的元数据。打个比方,我们在工程配置那里对插件进行了配置,这样就相当于创建了一个插脚的实例,这时候就需要一个类来存储插件的配置数据,这个类就是Descriptor。

public String getDisplayName() {
            return "Say hello world";
        }

如上面的代码,可以在Descriptor的这个方法下设置插件在工程配置页面下现实的名字

public boolean configure(StaplerRequest req, JSONObject o) throws FormException {
            // to persist global configuration information,
            // set that to properties and call save().
            useFrench = o.getBoolean("useFrench");
            save();
            return super.configure(req);
        }

如同注释属所说,这个方法用于将全局配置存储到项目中

快下班了,待续,呵呵

4
0
分享到:
评论
5 楼 daxiaoli123 2012-08-20  
怎么生成的啊
我下载了maven2   mvn -cpu hpi:create


C:\Documents and Settings\Administrator>mvn hpi:create
Error reading settings.xml: start tag not allowed in epilog but got s (position:
END_TAG seen ...</settings>\n\n\n<s... @260:3)
4 楼 classtwo5367 2009-07-08  
juvenshun 写道
国人不乏使用开源软件的文章和经验
但是如何扩展,这方面的资料很少,LZ能去做并共享出来,很的很好

哎..这也是我实习公司要求我做的..现学现卖..哈哈..
3 楼 juvenshun 2009-07-08  
国人不乏使用开源软件的文章和经验
但是如何扩展,这方面的资料很少,LZ能去做并共享出来,很的很好
2 楼 classtwo5367 2009-07-08  
juvenshun 写道
这类文章要支持的

呵呵,能力有限,也就能写成这样,献丑了,
1 楼 juvenshun 2009-07-08  
这类文章要支持的

相关推荐

    hudson插件加载失败解决方案.pdf

    hudson插件加载失败解决方案 本文档将讨论hudson插件加载失败的解决方案,涵盖hudson版本、环境信息、插件安装、Tomcat日志分析、问题排查等方面的知识点。 一、hudson版本信息 hudson版本:hudson-2.2.1.war ...

    hudson插件开发相关链接.zip

    《Hudson插件开发详解——源码与工具的探索之旅》 Hudson,作为一个开源的持续集成工具,因其丰富的插件系统和灵活的配置能力,深受开发者喜爱。本篇文章将围绕“Hudson插件开发”这一主题,深入探讨其源码解析、...

    jenkins hudson 插件开发部署外带一个小实例

    详细介绍了jenkins(hudson)的插件开发部署,指导你如何去开发一个插件,虽然里面那个插件没什么实际功能,但是有效果,能看到效果,这样你就可以了解到这个开发到底是怎么一回事,字面还带了一些资料,适合新手看看...

    m2eclipse-hudson插件

    Hudson是流行的一款开源CI服务器,而m2eclipse是Eclipse IDE中的Maven插件。将这两者结合的“m2eclipse-hudson插件”使得开发者能够在Eclipse环境中无缝地与Hudson集成,实现自动化构建和测试。 **一、m2eclipse...

    hudson学习教程Hudson安装与使用,Hudson配置,Hudson插件

    【Hudson 学习教程】 Hudson 是一款强大的持续集成工具,主要负责自动化软件...通过熟练掌握Hudson的安装、配置和插件使用,开发者可以构建出一套自动化、智能化的CI/CD流程,提升整个团队的开发效率和项目交付能力。

    Hudson常用插件说明

    Hudson,作为一款开源持续集成工具,通过丰富的插件系统,极大地增强了其灵活性和功能性,支持多种源代码管理和构建工具,满足不同开发团队的需求。以下是对部分常用插件的详细说明: #### 源代码管理插件 1. **...

    hudson插件工程

    - **插件架构**:Hudson 插件基于Java语言开发,采用Maven作为构建工具,遵循特定的插件结构,包括源代码、资源文件、配置文件等。 - **Maven配置**:开发Hudson插件时,通常会创建一个Maven项目,配置pom.xml文件...

    Hudson Jenkins插件相关

    Hudson和Jenkins是两款著名的持续集成(Continuous Integration, CI)工具,它们在软件开发过程中扮演着至关重要的角色。Hudson最初由Sun Microsystems开发,后因社区支持转为开源项目并更名为Jenkins。这两款工具...

    Hudson_CI:PHP持续集成

    2. **Hudson**:Hudson是由Sun Microsystems开发的开源持续集成工具,后来成为Oracle的一个项目。它提供了一个友好的Web界面,用于配置和管理构建任务,支持多种版本控制系统,如Git、SVN等,并可以与其他工具(如...

    hudson 开发指南

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

    hudson中checkStyle插件

    不知道怎么回事,hudson下载插件下载不下来,找了好久的checkStyle,在网上下载了都用不了。 后面偶然发现hudson又可以自动下载插件了。 checkStyle插件需要 analysis-core 支持,所以提供的下载包里面都放进去了, ...

    Hudson-GIT-plugin:Hudson的Git插件

    Hudson-GIT-plugin是专为Hudson(也称为Jenkins)设计的一款插件,它使得持续集成工具Hudson能够与Git版本控制系统无缝集成。这款插件的目的是简化开发者的工作流程,自动化代码版本管理,以及在代码变更时自动触发...

    使用Hudson持续集成 ppt

    - **Hudson持续集成目录结构**: - **Hudson的主工作区**:通常称为`HUDSON_HOME`,用于存放配置、日志等数据。 - **Hudson插件**:安装在Hudson中的附加组件,增强其功能。 - **第三方工具**:例如Ant、Maven等...

    hudson.part2.rar

    hudson.part2.rar

    cobertura.hpi 1.1 hudson插件

    相信看过基于Hudson的持续集成指南的人都会去下载hudson插件:cobertura.hpi,但是大家发现,网上铺天盖地的网址,都是无法打开。。。是的。。。这个插件差点找死我了。。。。 既然是别人做的,我也无权要分,0分送...

    hudson的ftp上传插件无法正常使用问题的处理

    ### hudson的ftp上传插件无法正常使用问题的处理 #### 问题概述 在使用Hudson进行构建自动化过程中,为了实现构建结果的自动化部署,通常会选择使用Hudson的FTP上传插件来实现构建产物的自动上传功能。但在实际使用...

    Hudson_continuous_Integration

    Hudson作为一款强大的持续集成工具,通过灵活的配置和丰富的插件生态,极大地提高了软件开发效率和代码质量。无论是个人开发者还是大型企业,都能从中获益。通过本文的介绍,相信读者对Hudson有了更全面的了解,能够...

    hudson1.293.part1.rar

    2. **丰富的插件**:Hudson拥有大量的插件,覆盖了各种构建工具、版本控制系统和测试框架,可以满足不同项目的特定需求。 3. **实时构建和测试报告**:Hudson可以在构建过程中实时显示测试结果,帮助开发者及时发现...

Global site tag (gtag.js) - Google Analytics