我们公司的Jenkins有主节点和两个从节点。我正在为它编写插件。插件的一个功能是从svn中检出一些文件。无法从插件中提取此操作。 为此,我从我的插件的java代码执行控制台命令“svn checkout”。问题是来自svn的文件被签出到master,而不是slave节点。 如何将文件签出到奴隶?
答案 0 :(得分:7)
首先,您拥有这些对象,通常作为perform
方法的参数接收:
Launcher launcher;
AbstractBuild<?, ?> build;
BuildListener listener;
然后你创建并添加了一个参数到一个argumentListBuilder,可能是这样的:
ArgumentListBuilder command = new ArgumentListBuilder();
command.addTokenized("xcopy /?");
然后,执行以下操作:
ProcStarter ps = launcher.new ProcStarter();
ps = ps.cmds(command).stdout(listener);
ps = ps.pwd(build.getWorkspace()).envs(build.getEnvironment(listener));
Proc proc = launcher.launch(ps);
int retcode = proc.join();
ProcStarter将在launcher
实例指定的节点上运行该命令。但是请在使用之前至少浏览一下上述所有类的javadocs,上面是 not 直接从工作代码中复制粘贴。
答案 1 :(得分:3)
以下是基于Hyde的答案的代码,适用于Groovy脚本控制台(/script
)
def static Run(nodeName, runCommand)
{
def output = new java.io.ByteArrayOutputStream();
def listener = new hudson.util.StreamTaskListener(output);
def node = hudson.model.Hudson.instance.getNode(nodeName);
def launcher = node.createLauncher(listener);
def command = new hudson.util.ArgumentListBuilder();
command.addTokenized(runCommand);
def ps = launcher.launch();
ps = ps.cmds(command).stdout(listener);
// ps = ps.pwd(build.getWorkspace()).envs(build.getEnvironment(listener));
def proc = launcher.launch(ps);
int retcode = proc.join();
return [retcode, output.toString()]
}
// for (aSlave in hudson.model.Hudson.instance.slaves) {
(recode, output) = Run("build-slave9", "xcopy /?");
println output;
(警告:对于读取stdin的程序未经测试。请注意ByteArrayOutputStream
,因此不要运行输出很长的程序。对于非ASCII输出未经测试。)