如何使用新的链接和图标扩展Jenkins作业页面

Ric*_*ard 7 jenkins jenkins-plugins

我正在开发我的第一个Jenkins插件,并按照wiki.jenkins-ci.org上的教程进行操作.添加BuildStep并生成结果后,我现在想将它们发布给用户.我想通过作业页面上的新链接条目和相应的结果视图页面来完成此操作.

遗憾的是,我找不到左侧导航栏的右侧扩展点,中心的主导航链接以及新的目标页面.有人可以指出我正确的方向或给我一个链接到解释这种情况的教程或博客文章?

谢谢

扩展工作页面

dch*_*ang 7

根行动和行动是不同的.第一个只能访问初始页面(root),第二个可以附加到Project/Job或Build.

要创建Root Action,只需要创建一个类:

  1. 用@Extension注释(因此它可以被Jenkins找到并自动加载)
  2. 实现RootAction接口
  3. 覆盖3个方法:getIconFileName(),getDisplayName()和getUrlName()

例如:

@Extension
public class GoogleRootAction implements RootAction{

    @Override
    public String getIconFileName() {
        return "clipboard.png";
    }

    @Override
    public String getDisplayName() {
        return "Google URL";
    }

    @Override
    public String getUrlName() {
        return "http://www.google.pt";
    }    
}
Run Code Online (Sandbox Code Playgroud)

要在项目中创建一个Action,它会更复杂,而且根据您的需要,不仅仅是一种方式.

但首先,类Action本身很容易,因为它与类RootAction非常相似.它没有使用@Extension注释并实现Action接口而不是RootAction.

例如:

public class LatestConsoleProjectAction implements Action {

    private AbstractProject<?, ?> project;

    @Override
    public String getIconFileName() {
        return (Jenkins.RESOURCE_PATH + "/images/48x48/terminal.png").replaceFirst("^/", "");
    }

    @Override
    public String getDisplayName() {
        return Messages.Latest_Console_Project_Action();
    }

    @Override
    public String getUrlName() {
        return "lastBuild/console";
    }

    public LatestConsoleProjectAction(final AbstractProject<?, ?> project) {
        this.project = project;
    }

}
Run Code Online (Sandbox Code Playgroud)

棘手的部分是通知jenkins这个类Action存在.正如我所说,有不同的方式.

例如,可以通过仅覆盖这些类的getProjectAction()方法将Action与Builder或Publisher或其他方法相关联.

例如:

@Override
public Action getProjectAction(AbstractProject<?, ?> project) {
    return new LatestConsoleProjectAction(project);
}
Run Code Online (Sandbox Code Playgroud)

但是这样,Action链接将仅显示在Project左侧菜单上,如果作业使用相应的Builder或Publisher(或在Job配置中选择).

另一种方式,它始终显示左侧菜单上的Action链接,它创建一个工厂类来通知jenkins.有很多工厂,但在我的例子中,我将使用TransientProjectActionFactory类.

为此,需要创建一个类:

  1. 它用@Extensions注释
  2. 扩展TransientProjectActionFactory类(或另一个Factory类)
  3. 覆盖createFor方法以创建与Project对象关联的Action类

例如:

@Extension
public class LatestConsoleProjectActionFactory extends TransientProjectActionFactory {

    @Override
    public Collection<? extends Action> createFor(AbstractProject abstractProject) {

        return Collections.singletonList(new LatestConsoleProjectAction(abstractProject));
    }
}
Run Code Online (Sandbox Code Playgroud)

仍然可以将项目对象过滤到您想要的项目类型.你不想要的那个,只返回Collections.emptyList().

除了这两种方式,我认为还有其他方式.你可以看到这个链接参考:https: //wiki.jenkins-ci.org/display/JENKINS/Action+and+its+family+of+subtypes

虽然,他们引用addAction方法和其他方法,但我无法使用它(我有2.19.2 Jenkins版本).他们也提到了groovy,但我没有尝试过,因为我想坚持使用Java :)

顺便说一句,我的例子将创建一个动作链接来打开最后一次构建的控制台页面.有助于避免选择上一个版本,然后选择他的控制台页面.


Ric*_*ard 3

经过大量的尝试和错误,我找到了解决方案。

总而言之,您的项目中需要两个不同的东西:

1)继承自ProminentProjectAction的类:

import hudson.model.ProminentProjectAction;

public class MyProjectAction implements ProminentProjectAction {

    @Override
    public String getIconFileName() {
        // return the path to the icon file
        return "/images/jenkins.png";
    }

    @Override
    public String getDisplayName() {
        // return the label for your link
        return "MyActionLink";
    }

    @Override
    public String getUrlName() {
        // defines the suburl, which is appended to ...jenkins/job/jobname
        return "myactionpage";
    }
}
Run Code Online (Sandbox Code Playgroud)

2)更重要的是,您以某种方式将此操作添加到您的项目中。

就我而言,当且仅当为实际项目配置了插件的相关构建步骤时,我才想显示链接。所以我使用了 Builder 类并覆盖了 getProjectActionsMethod。

public class MyBuilder extends Builder {

    ...

    @Override
    public Collection<? extends Action> getProjectActions(AbstractProject<?,?> project) {
        List<Action> actions = new ArrayList<>();
        actions.add(new MyProjectAction());

        return actions;
    }
}
Run Code Online (Sandbox Code Playgroud)

也许这还不是完美的解决方案(因为我仍在尝试弄清楚所有工件如何协同工作),但它可能会给想要实现相同功能的人们一个良好的起点。

单击链接后加载的页面定义为 source/main/resources 下的 index.jelly 文件和一个底层包,其中包含 Action 类的包名称并附加其类名称(例如 src/main/resources/ org/example/myplugin/MyProjectAction)。