Jenkins 在配置时间(和访问工作区)期间在作业的执行程序上执行 shell
Jenkins execute shell on job's executor during CONFIGURATION time (and access workspace)
我想创建一个简单的 Jenkins 插件。
基本上它是一个带有下拉列表的自定义构建步骤(构建器扩展)。诀窍是我想根据 配置 时间 shell script/command 执行的结果填充此下拉列表。
这是我的方法存根。
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;
}
我的问题如下:
如果也有 slave,Jenkins 是否维护 2 个工作区(所以最新的源代码将存在于两个位置?
我的理解是(在第一次构建之后)总是有两个工作区:在主机上有元信息(还有源代码?),在从机上有源代码和构建中间体、信息、工件。 (除非我们提取工件或使用 copy-to-slave-plugin)
我通过 project.getSomeWorkspace() 或 project.getSomeWorkspace().getRemote() 获得的工作区在哪里? (master/slave?)
如何在将执行构建的机器上调用 shell 命令?或者至少有没有办法特别选择主人/其中一个奴隶? (假设我已经在我想要 运行 作业的哪一组机器上配置了标签。)
我无权访问 AbstractBuild、BuildListener 和 Launcher(因为它们尚不存在...)
我如何找出可以使用@AncestorInPath 获得哪些属性。
我知道这是一个 shorthand,来自 Jenkins 调用的 StaplerRequest 的注入?如何查看请求?
执行 shell 命令的位置很重要,即使主从上有两个相同的工作区。在我的例子中,可能会有一个 Windows master(在未来)和一个 OSX slave。我确实需要 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 上会有一些。不要混淆术语 workspace(位于构建机器上)和 build result directory on master.
Project#getSomeWorkspace()
,为您提供 一些 过去构建使用的工作区。请注意,这是在纯粹尽力而为的基础上完成的,因为可能 none.
- 在配置时无法知道构建的位置 运行 除非您将作业绑定到一台特定的机器。请参阅
hudson.model.Node#createLauncher(TaskListener)
了解如何 运行 在 Jenkins 网格中处理。
@AncestorInPath
允许您注入一些在 URL 绑定期间由订书机遍历的域对象。你不应该尝试注入任何可能不属于 url 的东西。我不知道你有什么方法可以注入请求,订书机使用启动操作方法调用的方法。
最重要的是,您的尝试听起来很不寻常。也许有更简单的方法可以解决您原来的问题。
我想创建一个简单的 Jenkins 插件。
基本上它是一个带有下拉列表的自定义构建步骤(构建器扩展)。诀窍是我想根据 配置 时间 shell script/command 执行的结果填充此下拉列表。
这是我的方法存根。
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;
}
我的问题如下:
如果也有 slave,Jenkins 是否维护 2 个工作区(所以最新的源代码将存在于两个位置?
我的理解是(在第一次构建之后)总是有两个工作区:在主机上有元信息(还有源代码?),在从机上有源代码和构建中间体、信息、工件。 (除非我们提取工件或使用 copy-to-slave-plugin)我通过 project.getSomeWorkspace() 或 project.getSomeWorkspace().getRemote() 获得的工作区在哪里? (master/slave?)
如何在将执行构建的机器上调用 shell 命令?或者至少有没有办法特别选择主人/其中一个奴隶? (假设我已经在我想要 运行 作业的哪一组机器上配置了标签。)
我无权访问 AbstractBuild、BuildListener 和 Launcher(因为它们尚不存在...)我如何找出可以使用@AncestorInPath 获得哪些属性。
我知道这是一个 shorthand,来自 Jenkins 调用的 StaplerRequest 的注入?如何查看请求?
执行 shell 命令的位置很重要,即使主从上有两个相同的工作区。在我的例子中,可能会有一个 Windows master(在未来)和一个 OSX slave。我确实需要 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 上会有一些。不要混淆术语 workspace(位于构建机器上)和 build result directory on master.
Project#getSomeWorkspace()
,为您提供 一些 过去构建使用的工作区。请注意,这是在纯粹尽力而为的基础上完成的,因为可能 none.- 在配置时无法知道构建的位置 运行 除非您将作业绑定到一台特定的机器。请参阅
hudson.model.Node#createLauncher(TaskListener)
了解如何 运行 在 Jenkins 网格中处理。 @AncestorInPath
允许您注入一些在 URL 绑定期间由订书机遍历的域对象。你不应该尝试注入任何可能不属于 url 的东西。我不知道你有什么方法可以注入请求,订书机使用启动操作方法调用的方法。
最重要的是,您的尝试听起来很不寻常。也许有更简单的方法可以解决您原来的问题。