Jenkins 在配置时间(和访问工作区)期间在作业的执行程序上执行 shell

Jenkins execute shell on job's executor during CONFIGURATION time (and access workspace)

我想创建一个简单的 Jenkins 插件。

基本上它是一个带有下拉列表的自定义构建步骤(构建器扩展)。诀窍是我想根据 配置 时间 shell script/command 执行的结果填充此下拉列表。

这是我的方法存根。

    public ListBoxModel doFill...Items(@AncestorInPath AbstractProject project) {
        // determine workspace
        // project.getSomeWorkspace() or project.getSomeWorkspace().getRemote()
        ...
        // invoke some shell commands
        String[] results = ...

        ListBoxModel items = new ListBoxModel();
        for (String item : results) {
            items.add(item);
        }
        return items;
    }    

我的问题如下:

  1. 如果也有 slave,Jenkins 是否维护 2 个工作区(所以最新的源代码将存在于两个位置?
    我的理解是(在第一次构建之后)总是有两个工作区:在主机上有元信息(还有源代码?),在从机上有源代码和构建中间体、信息、工件。 (除非我们提取工件或使用 copy-to-slave-plugin)

  2. 我通过 project.getSomeWorkspace() 或 project.getSomeWorkspace().getRemote() 获得的工作区在哪里? (master/slave?)

  3. 如何在将执行构建的机器上调用 shell 命令?或者至少有没有办法特别选择主人/其中一个奴隶? (假设我已经在我想要 运行 作业的哪一组机器上配置了标签。)
    我无权访问 AbstractBuild、BuildListener 和 Launcher(因为它们尚不存在...)

  4. 我如何找出可以使用@AncestorInPath 获得哪些属性。
    我知道这是一个 shorthand,来自 Jenkins 调用的 StaplerRequest 的注入?如何查看请求?

执行 shell 命令的位置很重要,即使主从上有两个相同的工作区。在我的例子中,可能会有一个 Windows master(在未来)和一个 OSX slave。我确实需要 OSX 到 运行 我的命令。 (目前 OSX 上只有一个大师。)

编辑:

这是一个示例,是我正在尝试做的一部分。我在 Swift (JenkinsSwift) 中创建了一个简单的 Xcode 项目。在项目目录的终端中,我可以发出以下命令: xcodebuild -project JenkinsSwift.xcodeproj -list

并得到以下响应:

Targets:
    JenkinsSwift
    JenkinsSwiftTests

Build Configurations:
    Debug
    Release

If no build configuration is specified and -scheme is not passed then "Release" is used.

Schemes:
    JenkinsSwift

在配置期间,我想导航到 OS X 机器上的项目工作区我想发出上一个命令。这样我就可以解析这个响应并允许用户在配置期间选择目标/配置/方案。 (当然这可以通过 bash 脚本手动完成,但我想让它更简单。)

  1. 工作方式不同,默认情况下作业没有工作空间。一旦在构建机器上构建 运行(无论是主机还是从机),就会分配一个。根据作业的位置和次数,给定作业可以有任意数量的工作空间 运行。但是,不能保证 master 上会有一些。不要混淆术语 workspace(位于构建机器上)和 build result directory on master.
  2. Project#getSomeWorkspace(),为您提供 一些 过去构建使用的工作区。请注意,这是在纯粹尽力而为的基础上完成的,因为可能 none.
  3. 在配置时无法知道构建的位置 运行 除非您将作业绑定到一台特定的机器。请参阅 hudson.model.Node#createLauncher(TaskListener) 了解如何 运行 在 Jenkins 网格中处理。
  4. @AncestorInPath 允许您注入一些在 URL 绑定期间由订书机遍历的域对象。你不应该尝试注入任何可能不属于 url 的东西。我不知道你有什么方法可以注入请求,订书机使用启动操作方法调用的方法。

最重要的是,您的尝试听起来很不寻常。也许有更简单的方法可以解决您原来的问题。