java - Jenkins 在配置时间内在作业的执行器上执行 shell(并访问工作区)

标签 java shell jenkins jenkins-plugins

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

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

这是我的方法 stub 。

    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. 如果也有从站,Jenkins 是否维护 2 个工作区(因此最新的源代码将存在于两个位置?
    我的理解是(在第一次构建之后)总是有两个工作区:在主设备上有元信息(还有源代码?),在从设备上有源代码和构建中间体、信息、工件。 (除非我们提取工件或使用复制到从属插件)

  2. 通过project.getSomeWorkspace() 或project.getSomeWorkspace().getRemote() 获得的工作空间在哪里? (主/从?)

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

  4. 如何找出可以通过 @AncestorInPath 获得哪些属性。
    我知道这是一个简写,是来自 Jenkins 调用的 StaplerRequest 的注入(inject)?我如何才能看到该请求?

即使主设备和从设备上有两个相同的工作空间,shell 命令的执行位置也很重要。就我而言,可能有一个 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 脚本手动完成,但我想让它变得更容易。)

最佳答案

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

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

关于java - Jenkins 在配置时间内在作业的执行器上执行 shell(并访问工作区),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30821697/

相关文章:

git - 让 NuGet 与整个解决方案和其中包含的单个项目一起工作

java - Log4j 在本地主机上工作正常,但在 Jenkins 中,所有日志语句都打印在同一行上

docker - Jenkins 无法安装插件 unknownhost

bash - 在两个分隔符之间提取多行数据

arrays - 将文件捕获到数组中并在 while 循环中使用该数组

java - Jboss 无法实例化类“org.jboss.logmanager.handlers.PeriodicRotatingFileHandle

java - 如何在 Spring 中将错误消息从 bean 传递到表单

shell - sqlite 触发器输出

java - 在将二进制转换为十进制的程序中不断得到错误的答案

java - 如何通过检查长度和比较 Java 中的文本从数组中删除字符串?