首页 > 解决方案 > Jenkins 如何在远程 slave 上执行代码?

问题描述

我有一段代码可以列出/tmp两个节点上目录中的所有文件,如下所示(脚本语法):

stage('Demo') {
    node('node1') {
        println new File('/tmp/').listFiles().toList()
    }

    node('node2') {
        println new File('/tmp/').listFiles().toList()
    }
}

但是,两个节点的结果是相同的。看起来代码是在 master 上执行的,只有 println 函数在 2 个节点上执行。

问题是:这是真的吗?如果是这样,我怎么知道代码是在主服务器还是从服务器上执行的?

标签: jenkinsjenkins-pipeline

解决方案


所有使用node上下文的 Jenkins 步骤都将在这些代理上执行(来自node块)。例如, ash 'ls -1 /tmp/'ls -1 /tmp/ command在块中的那个代理上运行。但是,实际的 Groovysh方法和 JVM 代码在 Jenkins 主服务器上执行。

Jenkins 管道内的所有 Groovy 都在 master 上以来自Pipeline Groovy Plugin的特殊源代码转换方式执行。因此,为什么new File('/tmp')在主服务器而不是代理服务器上执行。如果您使用安全沙箱运行管道,则会收到安全异常,因为new File默认情况下是不允许的。事实上,任何正常的 JVM 风格的方法都是不允许的。例如,如果管道可以System.exit(0)为所有用户调用并关闭 Jenkins,那不是很糟糕吗?

类似的问题:


推荐阅读