我们公司的Jenkins有主节点和两个从节点。我正在为它编写插件。插件要做的一件事是从 svn 中检出一些文件。无法从插件中提取此操作。为此,我从插件的 java 代码中执行控制台命令“svn checkout”。问题是来自 svn 的文件被检出到主节点,而不是从节点。如何使文件签出到从站?
问问题
6016 次
2 回答
8
首先你有这些对象,通常作为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,上面不是直接从工作代码中复制粘贴。
于 2012-11-01T12:28:25.340 回答
3
这是基于 Hyde 的回答的代码,适用于 Groovy 脚本控制台 (at /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;
(警告:未测试读取标准输入的程序。注意ByteArrayOutputStream
, 所以不要运行输出很长的程序。未测试非 ASCII 输出。)
于 2014-04-22T17:11:07.240 回答