我正在开发我的第一个Jenkins插件,并按照wiki.jenkins-ci.org上的教程进行操作。添加BuildStep并生成结果后,我现在想将它们发布给用户。我想通过作业页面上的新链接条目和相应的结果视图页面来完成此操作。
不幸的是,我找不到左侧导航栏的正确扩展点,中心的主导航链接以及新的目标页面。有人可以指出我正确的方向,或者给我一个指向解释这种情况的教程或博客文章的链接吗?
由于
答案 0 :(得分:5)
Root Action和Actions是不同的。第一个只能访问初始页面(root),第二个可以附加到Project / Job或Build。
要创建Root Action,只需要创建一个类:
例如:
@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";
}
}
要在项目中创建一个动作,它会更复杂,而且根据您的需要,不仅仅是一种方式。
但首先,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;
}
}
棘手的部分是通知jenkins这个类Action存在。正如我所说,有不同的方式。
例如,可以通过覆盖这些类的getProjectAction()方法将Action与Builder或Publisher或其他方法关联起来。
例如:
@Override
public Action getProjectAction(AbstractProject<?, ?> project) {
return new LatestConsoleProjectAction(project);
}
但是这样,Action链接只会显示在Project左侧菜单上,如果作业使用相应的Builder或Publisher(或在Job配置中选择)。
另一种方式,它始终显示左侧菜单上的Action链接,它创建一个工厂类来通知jenkins。有很多工厂,但在我的例子中,我将使用TransientProjectActionFactory类。
为此,需要创建一个类:
例如:
@Extension
public class LatestConsoleProjectActionFactory extends TransientProjectActionFactory {
@Override
public Collection<? extends Action> createFor(AbstractProject abstractProject) {
return Collections.singletonList(new LatestConsoleProjectAction(abstractProject));
}
}
仍然可以将项目对象过滤到您想要的项目类型。你不想要的那个,只需返回Collections.emptyList()。
除了这两种方式,我认为还有其他方式。你可以看到这个链接参考: https://wiki.jenkins-ci.org/display/JENKINS/Action+and+its+family+of+subtypes
虽然,他们引用了addAction方法和其他方法,但我无法使用它(我有2.19.2 Jenkins版本)。 他们也提到了groovy,但我没有尝试过,因为我想坚持使用Java:)
顺便说一句,我的示例将创建一个操作链接来打开上一次构建的控制台页面。有助于避免选择最后一个版本,然后选择他的控制台页面。
答案 1 :(得分:2)
碰巧的是,史蒂文·克里斯托在最近的plugin workshop波士顿有一个Jenkins User Conference,其中涉及此案。您需要添加一个新的RootAction,如以下JUC会话代码所示
package org.jenkinsci.plugins.JUCBeer;
import hudson.Extension;
import hudson.model.RootAction;
@Extension
public class JenkinsRootAction implements RootAction {
public String getIconFileName() {
return "/images/jenkins.png";
}
public String getDisplayName() {
return "Jenkins home page";
}
public String getUrlName() {
return "http://jenkins-ci.org";
}
}
答案 2 :(得分:1)
经过大量的反复试验后,我找到了解决方案。
总而言之,您的项目需要两个不同的东西:
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";
}
}
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;
}
}
也许这还不是一个完美的解决方案(因为我还在试图弄清楚所有工件是如何协同工作的),但它可能会让那些希望实现同样工作的人成为一个良好的起点。
在单击链接后加载的页面被定义为source / main / resources下的index.jelly文件和一个底层包,其中包含Action类的包名,附加了类名(例如src / main) /资源/组织/示例/为myplugin / MyProjectAction)。
答案 3 :(得分:0)
https://github.com/ngocson2vn/s3explorer是我的Jenkins插件,它向所有Jenkins项目的侧面板添加了一个S3 Explorer
链接。
答案 4 :(得分:0)
@dchang comment的附加内容:
通过扩展TransientActionFactory<WorkflowJob>
,我设法使此功能也可以在管道上使用:
@Extension
public static class PipelineLatestConsoleProjectActionFactory extends TransientActionFactory<WorkflowJob> {
@Override
public Class<WorkflowJob> type() {
return WorkflowJob.class;
}
@Nonnull
@Override
public Collection<? extends Action> createFor(@Nonnull WorkflowJob job) {
return Collections.singletonList(new LatestConsoleProjectAction(job));
}
}