Jenkins插件,如何在远程节点上执行系统命令?

时间:2012-11-01 12:00:56

标签: jenkins jenkins-plugins

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

2 个答案:

答案 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输出未经测试。)