Jenkins如何在远程从站上执行代码?

时间:2018-09-12 20:26:08

标签: jenkins jenkins-pipeline

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

即使您在管道中写入node('someAgentName'),管道DSL上下文也会在主节点上运行。 new File仅适用于母版。

但是您可以通过sh()从文件中读取数据。像这样:

def list = sh(returnStdout: true, script: 'ls').trim()

答案 1 :(得分:1)

所有使用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,这不是很糟糕吗?

类似的问题: