Jenkins如何在远程节点上执行代码?

4

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

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

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

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

问题是:这是真的吗?如果是,我如何知道代码是在主节点还是从节点上执行的?


管道代码在“主”上执行。我已经写了一些答案涉及到这个问题(比如这里这里)。 - mkobit
根据这两个链接,node内的代码块不应该在代理上执行吗? - FuzzY
3
使用 node 上下文的任何 Jenkins 步骤都将在那些代理上执行。例如,sh 'ls -1 /tmp/' 将在该代理上运行 ls -1 /tmp/ 命令。但是,实际的 Groovy sh 方法和 JVM 代码在 Jenkins 主服务器上执行。Jenkins 管道中的所有 Groovy 代码都在主服务器上执行。这就是为什么 new File('/tmp') 在主服务器上执行而不是代理上。希望这不会增加更多的困惑。 - mkobit
@mkobit:请把你的评论变成答案,这样我就可以把这个问题标记为已解决。如果可以的话,请在答案中详细说明如何知道一个步骤是否需要Jenkins上下文。 - FuzzY
2个回答

3
管道DSL上下文即使您在流水线中写入node('someAgentName'),也在主节点上运行。 new File仅在主节点上工作。
但是,您可以通过sh()从文件中读取数据。类似于:
def list = sh(returnStdout: true, script: 'ls').trim()

3
所有使用node上下文的Jenkins步骤都将在这些代理上执行(来自node块)。 例如,sh 'ls -1 /tmp/'将在该块中的代理上运行ls -1 /tmp/ command。但是,实际的Groovy sh方法和JVM代码在Jenkins主服务器上执行。
Jenkins流水线中的所有Groovy代码都以特殊的源转换方式在主服务器上执行,来自Pipeline Groovy Plugin。 因此,new File('/tmp')在主服务器上执行,而不是在代理上执行。 如果您使用安全沙盒运行流水线,则会出现安全异常,因为默认情况下禁止使用new File。 实际上,任何正常的JVM样式方法都是被禁止的。 例如,如果允许流水线调用System.exit(0)并关闭Jenkins,那将是可怕的。
类似问题:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接