我有一段代码可以列出两个节点上/tmp
目录中的所有文件,就像这样(脚本语法):
stage('Demo') {
node('node1') {
println new File('/tmp/').listFiles().toList()
}
node('node2') {
println new File('/tmp/').listFiles().toList()
}
}
但是,两个节点的结果是相同的。看起来代码是在主节点上执行的,只有println函数在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,这不是很糟糕吗?
类似的问题: