扩展你的插件

    我们必须存储运行构建时使用的名称,而不是使用配置中的名称,因为配置随时可能会被更改。

    首先,在与 相同的包中创建一个名为 HelloWorldAction 的类。 该类需要实现 。 Actions 是 Jenkins 中可扩展性的基本构建块:它们可以附加到许多模型对象上并被储存起来,并可以添加到它们的 UI 中。

    由于我们要存储问候中使用的名称,因此我们需要为此类添加一个 getter。我们还将添加一个以 name 为参数的构造方法。

    1. (...)
    2. public class HelloWorldAction implements Action {
    3. private String name;
    4. public HelloWorldAction(String name) {
    5. this.name = name;
    6. }
    7. public String getName() {
    8. return name;
    9. (...)

    现在,我们实际上需要在构建步骤执行时创建该类的一个实例。 我们需要扩展 HelloWorldBuilder 类中的 perform 方法来把我们创建的动作的一个实例添加到正在运行的构建中:

    1这一行是新增的,其他所有内容都保持不变。

    保存这些修改,然后用 mvn hpi:run 再次运行插件。

    每当修改 Java 源代码或添加删除资源文件时,您都需要重新启动 Jenkins 实例才能使修改生效。 Jenkins 通过 hpi:run 运行时只能编辑一些资源文件。

    现在,使用此构建步骤运行构建时,该操作将被添加到构建数据中。 我们可以通过查看与 work/jobs/JOBNAME/builds/BUILDNUMBER/ 目录中的构建版本相对应的 build.xml 文件来确认。

    我们可以看到,这个构建中有两个动作:

    1. <build>
    2. <actions>
    3. <hudson.model.CauseAction> (1)
    4. <causes>
    5. <hudson.model.Cause_-UserIdCause/>
    6. </causes>
    7. </hudson.model.CauseAction>
    8. <io.jenkins.plugins.sample.HelloWorldAction plugin="demo@1.0-SNAPSHOT"> (2)
    9. </io.jenkins.plugins.sample.HelloWorldAction>
    10. </actions>
    11. (...)
    12. </build>

    首先,我们需要回到过去 HelloWorldAction 并定义图标,标题和 URL 名称:

    1这是用于侧面板项目的图标。 document.png 是 Jenkins 绑定的预定义图标之一。
    2这是用于侧面板项目的标签。
    3这是用于此操作的 URL 片段。

    通过这些修改,操作将显示在构建的侧面板中,并链接到 URL http://JENKINS/job/JOBNAME/BUILDNUMBER/greeting/

    接下来,需要定义出现在该 URL 上的页面。为了在 Jenkins 创建这样的 视图 , 通常使用 Apache Commons Jelly。Jelly 允许用 XML 定义 XML 和 XHTML 输出。它有许多有用的功能:它

    src/main/resources/io/jenkins/plugins/sample/ 中, 我们需要创建一个新的名为 HelloWorldAction/ 的目录。该目录与 HelloWorldAction 类对应并包含相关资源。

    它是 src/main/resources 中的一个目录, 而不是 src/main/java

    src/main/resources/io/jenkins/plugins/sample/HelloWorldAction/ 目录创建名为 index.jelly 的文件。这将会显示在 http://JENKINS/job/JOBNAME/BUILDNUMBER/greeting/ URL 上。添加以下内容:

    1. <?jelly escape-by-default='true'?>
    2. <l:layout title="Greeting"> (1)
    3. <l:main-panel> (2)
    4. <h1> (3)
    5. Name: ${it.name} (4)
    6. </h1>
    7. </l:main-panel>
    8. </l:layout>
    1layout 是 Jenkins 核心中定义的可重用 tag,它提供了页眉,侧面板,主要内容区域和页脚的基本页面布局。
    2为了使名称显示在主内容区域(而不是侧面板),我们需要将输出包裹在 main-panel 标签中。
    3我们可以使用任何 HTML 标签,并将它们用于输出。
    4这是一个 表达式。 it 引用视图所属的Java对象 (类似于Java中的 this),在本例中为 HelloWorldAction 实例。 it.name 等同于调用 getName()

    结果页面看起来像这样:

    在上面的输出中没有侧面板,由于此视图与特定版本相关,因此应该显示该版本的侧面板。 为此,我们首先需要获取对我们动作中相应构建的引用,然后在动作视图中包含构建的侧面视图 fragment

    为了获得 HelloWorldAction 所属的构建(或者更一般地说, Run)的引用,我们需要改变现有的类以使其实现

    该接口添加了两个方法,当运行首次连接到构建时 onAttached(Run),以及从磁盘 onLoad(Run) 加载操作和运行时分别调用该方法。

    1实现 RunAction2 接口,以便添加到 Run 的 Action 能够恰当地引用 Run。
    2Run 存储在一个瞬态动作中,所以这个字段不会被序列化到磁盘上。
    3首次将此操作附加到 Run 时设置该字段。
    4从磁盘加载此操作时设置该字段。
    5这将使 Run 可用于 Jelly 视图 — 它不能访问私有字段。

    这些一旦完成之后,我们需要将扩展这个视图来将 Run 的侧面板视图片段 包含 进来:

    1. (...)
    2. <l:layout title="Greeting">
    3. <l:side-panel> (1)
    4. <st:include page="sidepanel.jelly" it="${it.run}" optional="true" /> (2)
    5. </l:side-panel>
    6. <l:main-panel>
    7. (...)
    8. </l:main-panel>
    9. (...)

    有了这些修改,我们创建的视图与 Jenkins UI 正确集成,与构建版本相关的内置页面没有任何区别:

    view2

    恭喜,您已成功创建并大幅扩展了 Jenkins 插件!

    没有适合你的东西? 在 或 jenkinsci-dev 邮件列表中寻求帮助。