我们公司的Jenkins有主节点和两个从节点 . 我正在为它编写插件 . 插件的一个功能是从svn中检出一些文件 . 无法从插件中提取此操作 . 为此,我从我的插件的java代码执行控制台命令“svn checkout” . 问题是来自svn的文件被签出到master,而不是slave节点 . 如何将文件签出到奴隶?
首先你有这些对象,通常作为 perform 方法的参数接收:
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 实例指定的节点上运行该命令 . 但是请在使用之前至少浏览一下上面所有类的javadoc,上面不是直接从工作代码中复制粘贴 .
launcher
这是基于Hyde的答案的代码,适用于Groovy脚本控制台(在 /script )
/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输出未经测试 . )
ByteArrayOutputStream
2 回答
首先你有这些对象,通常作为
perform
方法的参数接收:然后你创建并添加了一个参数到一个argumentListBuilder,可能是这样的:
然后,做一些像:
ProcStarter将在
launcher
实例指定的节点上运行该命令 . 但是请在使用之前至少浏览一下上面所有类的javadoc,上面不是直接从工作代码中复制粘贴 .这是基于Hyde的答案的代码,适用于Groovy脚本控制台(在
/script
)(警告:对于读取stdin的程序未经测试 . 请注意
ByteArrayOutputStream
,因此不要运行输出很长的程序 . 对于非ASCII输出未经测试 . )