【问题标题】:Jenkins execute shell on job's executor during CONFIGURATION time (and access workspace)Jenkins 在 CONFIGURATION 期间在作业的执行程序上执行 shell(并访问工作区)
【发布时间】:2015-06-13 17:45:19
【问题描述】:

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

基本上它是一个带有下拉列表的自定义构建步骤(构建器扩展)。诀窍是我想从 配置 期间执行的 shell 脚本/命令的结果中填充这个下拉列表。

这是我的方法存根。

    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() 获得的工作空间在哪里? (主/从?)

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

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

shell 命令的执行位置很重要,即使 master 和 slave 上有两个相同的工作空间。就我而言,可能会有一个 Windows 主机(将来)和一个 OSX 从机。我确实需要 OSX 来运行我的命令。 (目前OSX上只有一个master。)

编辑:

这是一个例子,我正在尝试做的一部分。我在 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 脚本手动完成,但我想让它更容易。)

【问题讨论】:

    标签: java shell jenkins jenkins-plugins


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

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

    【讨论】:

    • 非常感谢您的回答。你让我明白了(呃)。关于第三个问题:我是否理解正确,我可以在 Jenkins 中创建一个“无名”、“不可见”的新工作 - 在配置期间 - 可以在我特定愿望的节点上执行(或按标签),并且工作完成后,处理结果?我提供了一个简单的例子来说明我的“非常不寻常的愿望”。你对此有更好的主意吗?我是否尝试了错误的方法?
    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多