jenkins - Jenkins 如何在远程 slave 上执行代码?
问题描述
我有一段代码可以列出/tmp
两个节点上目录中的所有文件,如下所示(脚本语法):
stage('Demo') {
node('node1') {
println new File('/tmp/').listFiles().toList()
}
node('node2') {
println new File('/tmp/').listFiles().toList()
}
}
但是,两个节点的结果是相同的。看起来代码是在 master 上执行的,只有 println 函数在 2 个节点上执行。
问题是:这是真的吗?如果是这样,我怎么知道代码是在主服务器还是从服务器上执行的?
解决方案
所有使用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,那不是很糟糕吗?
类似的问题:
推荐阅读
- google-chrome - 为什么 Chrome 不使用 Xpath 突出显示 Elements 中的元素
- vue.js - vue中如何在不调用下拉事件的change事件的情况下从下拉列表中删除一个项目
- php - Facebook 共享 SDK 不适用于 Mozilla Firefox 隐身浏览器
- python - 为什么 Python 字符串格式看起来不一样?
- reactjs - 在 React Native 上导航到主屏幕时出错
- python - 如何使功能在某个时间开始
- vb.net - REST 请求使用 HTTPWebResponse 不会带来任何结果
- google-apps-script - 您如何允许在 Google Data Studio 中替换 API 密钥?
- node.js - Having to send SIGINT multiple times for Puppeteer script to close
- python - 如何仅在 python unittest 补丁装饰器中返回值