首页 文章

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

提问于
浏览
4

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

2 回答

  • 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 实例指定的节点上运行该命令 . 但是请在使用之前至少浏览一下上面所有类的javadoc,上面不是直接从工作代码中复制粘贴 .

  • 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输出未经测试 . )

相关问题