Jenkins在CONFIGURATION期间(和访问工作区)

时间:2015-06-13 17:45:19

标签: java shell jenkins jenkins-plugins

我想创建一个简单的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;
    }    

我的问题如下:

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

  2. 使用project.getSomeWorkspace()或project.getSomeWorkspace()。getRemote()得到的工作空间在哪里? (主/从?)

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

  4. 如何找出@AncestorInPath可以获得哪些属性。
    我知道这是一个简写,是Jenkins调用的StaplerRequest注入的吗?我怎样才能看到请求?

  5. 即使主服务器和从服务器上有两个相同的工作空间,执行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脚本手动完成,但我想让它变得更容易。)

1 个答案:

答案 0 :(得分:1)

  1. 这种方式不同,默认情况下没有作业的工作区。只要在构建计算机上运行构建(主服务器或从服务器),就会分配一个。根据作业运行的位置和次数,可以为给定作业提供任意数量的工作空间。虽然,不能保证主人会有一些。不要在主服务器上混淆 workspace (生活在构建机器上)和构建结果目录
  2. private String getDate(String dateString) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); Date value = null; try { value = formatter.parse(dateString); } catch (ParseException e) { e.printStackTrace(); } SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy hh:mmaa"); dateFormatter.setTimeZone(TimeZone.getDefault()); String dt = dateFormatter.format(value); return dt; } ,为您提供某些过去版本所使用的工作区。请注意,这是在纯粹的最佳努力基础上完成的,因为可能没有。
  3. 除非您将作业绑定到某台特定计算机,否则无法知道构建在配置时运行的位置。有关如何在Jenkins网格中运行进程,请参阅Project#getSomeWorkspace()
  4. hudson.model.Node#createLauncher(TaskListener)允许您在URL绑定期间注入一些由stapler遍历的ware对象。你不应该尝试注入任何可能不属于url的东西。我无法知道您注入请求,订书机使用启动操作方法调用的方法。
  5. 最重要的是你尝试的听起来很不寻常。也许有一种更简单的方法来解决你原来的问题。