我想创建一个简单的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的内容。对我而言,您无法注入请求,装订器使用启动动作方法调用的方法。
最重要的是,您尝试的操作听起来很不寻常。也许有一种更简单的方法可以解决您的原始问题。