• Jenkins插件开发(5)—— 向Jenkins注册自定义扩展点


    WIKI文档参照:https://wiki.jenkins-ci.org/display/JENKINS/Defining+a+new+extension+point

    片段如下:

    Implementing extension points
    Implementing an extension point defined in a plugin is no different from implementing an extension point defined in the core. See hudson.Extension for more details.
    
    @Extension
    public class Lion extends Animal { ... }

    “@Extension”的说明参考:http://javadoc.jenkins-ci.org/?hudson/Extension.html

    片段如下:

    hudson 
    Annotation Type Extension
    
    @Retention(value=RUNTIME)
    @Target(value={TYPE,FIELD,METHOD})
    @Documented
    public @interface Extension
    Marks a field, a method, or a class for automatic discovery, so that Hudson can locate implementations of ExtensionPoints automatically.
    
    (In contrast, in earlier Hudson, the registration was manual.)
    
    In a simplest case, put this on your class, and Hudson will create an instance of it and register it to the appropriate ExtensionList.
    (在Class上添加@Extension注解,是最简单的向Jenkins注册扩展点实现的方式。) If you'd like Hudson to call a factory method instead of a constructor, put this annotation on your static factory method. Hudson will invoke it and if the method returns a non-null instance, it'll be registered. The return type of the method is used to determine which ExtensionList will get the instance. Finally, you can put this annotation on a static field if the field contains a reference to an instance that you'd like to register. This is the default way of having your implementations auto-registered to Hudson, but Hudson also supports arbitrary DI containers for hosting your implementations. See ExtensionFinder for more details.

    验证扩展点是否注册成功:

    示例1: ExtensionList<ItemListener> extList = Jenkins.getInstance()
                    .getExtensionList(ItemListener.class); 
    示例2: ExtensionList<ItemListener> extList = Jenkins.getInstance()
                    .getExtensionList(SaveableListener.class); 

    以ItemListerner为例进行了测试:

    创建一个helloworld插件框架,在HelloWorldBuilder.java中添加如下内部类:

        @Extension
        public static final class MyProjectRenameListener extends ItemListener {
            @Override
            public void onRenamed(Item item, String oldName, String newName) {
                super.onRenamed(item, oldName, newName);
            }
        }

    在perform方法中检测扩展点是否已经被注册了:

        @Override
        public boolean perform(AbstractBuild 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.
    
            ExtensionList<ItemListener> extList = Jenkins.getInstance().getExtensionList(ItemListener.class);
    
            // This also shows how you can consult the global configuration of the
            // builder
            if (getDescriptor().getUseFrench())
                listener.getLogger().println("Bonjour, " + name + "!");
            else
                listener.getLogger().println("Hello, " + name + "!");
            return true;
        }

    Debug之后,extList的值为:

    [com.yihaodian.plugin.jenkins.jobsync.HelloWorldBuilder$MyProjectRenameListener@84c1c3, hudson.diagnosis.OldDataMonitor$2@1cd000a, hudson.model.DisplayNameListener@1bdb13f, hudson.model.Fingerprint$ProjectRenameListener@bfb588, hudson.tasks.BuildTrigger$DescriptorImpl$ItemListenerImpl@270dbf, org.jenkinsci.main.modules.sshd.ItemListenerImpl@1f79b9a]

    PS:后面的几章节将会记录我将要开发的一个Jenkins插件的整个开发过程。

  • 相关阅读:
    Ubuntu安装最新版的nodejs
    Mac安装并破解OmniGraffle7
    Mac安装并破解StarUML
    Windows10使用Chocolatey安装mysql之后无法使用的解决办法
    Visual Studio编辑类模板的位置
    VS2017连接到中国区的Azure
    Windows上包管理器之Chocolatey初体验
    CENTOS7.3 64位架设使用MYSQL数据库的ASP.NET CORE网站
    从无到有开发自己的Wordpress博客主题---主页模板
    c# 获得方法的所属类(或调用者)的类名,方法名
  • 原文地址:https://www.cnblogs.com/zhangqingsh/p/3029600.html
Copyright © 2020-2023  润新知