5

我们公司的Jenkins有主节点和两个从节点。我正在为它编写插件。插件要做的一件事是从 svn 中检出一些文件。无法从插件中提取此操作。为此,我从插件的 java 代码中执行控制台命令“svn checkout”。问题是来自 svn 的文件被检出到主节点,而不是从节点。如何使文件签出到从站?

4

2 回答 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 回答