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

基本上,这是一个带有下拉列表的自定义构建步骤(Builder扩展)。诀窍是,我想根据配置期间执行的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;
    }


我的问题如下:


如果也有奴隶,詹金斯是否会维护2个工作区(因此,最新的源代码将在两个位置同时存在吗?
我的理解是(在第一次构建之后)总是有两个工作空间:在主数据库上有元信息(和源代码也一样?),在从属数据库上有源代码和构建中间件,信息,工件。 (除非我们提取工件或使用复制到从属插件)
我通过project.getSomeWorkspace()或project.getSomeWorkspace()。getRemote()得到的工作区在哪里? (主从?)
如何在将执行构建的计算机上调用Shell命令?或者至少有一种方法可以选择主机/特别是从机之一? (假设我已经在要运行作业的机器组上配置了标签。)
我无权访问AbstractBuild,BuildListener和Launcher(因为它们尚不存在...)
我怎样才能通过@AncestorInPath获得哪些属性。
我知道这是简写,是詹金斯(Jenkins)调用的StaplerRequest的注入?我如何看到请求?


即使在主服务器和从服务器上有两个相同的工作区,执行shell命令的位置也很重要。就我而言,将来可能会有Windows主服务器和OSX从属服务器。我确实需要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脚本手动完成此操作,但我想使其变得更容易。)

最佳答案

工作原理不同,默认情况下没有作业的工作空间。一旦在构建机器上运行构建(主机器或从机器),就会分配一个。根据作业的运行位置和运行次数,给定作业可以有任意数量的工作空间。虽然,但不能保证一定会有一些大师。不要混淆术语工作区(位于构建机器上)和master上的构建结果目录。
Project#getSomeWorkspace(),为您提供了一些以前的版本使用的工作空间。请注意,这可能是在完全尽力而为的基础上完成的,因为可能没有。
除非您将作业绑定到一台特定的计算机,否则无法知道在配置时构建将在哪里运行。有关如何在Jenkins网格中运行进程的信息,请参见hudson.model.Node#createLauncher(TaskListener)
@AncestorInPath允许您注入URL绑定期间装订器遍历的某些域对象。您不应尝试注入任何可能不属于url的内容。对我而言,您无法注入请求,装订器使用启动动作方法调用的方法。


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

09-27 00:16
查看更多