jenkins - Jenkins 管道中的列表和并行任务
问题描述
我目前正在开发一个 Jenkins 管道,以使用 Ansible 配置不同的主机。供应不同的主机将并行完成。
这只是探索以这种方式进行的可能性的概念证明。所以我的方法并没有真正做任何事情。就是这样:def a
def ansibleSecurityTools(server){
println("Clone Security Playbook")
println("Download Ansible galaxy requirements")
skipTags = []
for (st in server.server.security_tools) {
if (!st.value)
skipTags.add(st.key.toLowerCase())
}
println(skipTags)
我创建这样的并行任务:
securityTasks = env_config.servers.collectEntries {
["${it.server.hostname}_security_tools" : { ansibleSecurityTools(it) }]
}
像这样运行它们
parallel securityTasks
正如预期的那样,任务并行运行。但是,对于我的示例数据,我希望看到 7 个带有tripwire
. 没有其他的。但是,这是控制台输出:
Running on slave in /home/vagrant/jenkins/workspace/eac
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Parse Info from Server YAML)
[Pipeline] readYaml
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Run Terraform)
[Pipeline] echo
Placeholder
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Security Tools)
[Pipeline] parallel
[Pipeline] [HOST1_security_tools] { (Branch: HOST1_security_tools)
[Pipeline] [HOST2_security_tools] { (Branch: HOST2_security_tools)
[Pipeline] [HOST3_security_tools] { (Branch: HOST3_security_tools)
[Pipeline] [HOST4_security_tools] { (Branch: HOST4_security_tools)
[Pipeline] [HOST5_security_tools] { (Branch: HOST5_security_tools)
[Pipeline] [HOST6_security_tools] { (Branch: HOST6_security_tools)
[Pipeline] [HOST7_security_tools] { (Branch: HOST7_security_tools)
[Pipeline] [HOST1_security_tools] echo
[HOST1_security_tools] Clone Security Playbook
[Pipeline] [HOST1_security_tools] echo
[HOST1_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST2_security_tools] echo
[HOST2_security_tools] Clone Security Playbook
[Pipeline] [HOST2_security_tools] echo
[HOST2_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST3_security_tools] echo
[HOST3_security_tools] Clone Security Playbook
[Pipeline] [HOST3_security_tools] echo
[HOST3_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST4_security_tools] echo
[HOST4_security_tools] Clone Security Playbook
[Pipeline] [HOST4_security_tools] echo
[HOST4_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST5_security_tools] echo
[HOST5_security_tools] Clone Security Playbook
[Pipeline] [HOST5_security_tools] echo
[HOST5_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST6_security_tools] echo
[HOST6_security_tools] Clone Security Playbook
[Pipeline] [HOST6_security_tools] echo
[HOST6_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST7_security_tools] echo
[HOST7_security_tools] Clone Security Playbook
[Pipeline] [HOST7_security_tools] echo
[HOST7_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST1_security_tools] echo
[HOST1_security_tools] [tripwire]
[Pipeline] [HOST1_security_tools] }
[Pipeline] [HOST2_security_tools] echo
[HOST2_security_tools] [tripwire, tripwire]
[Pipeline] [HOST2_security_tools] }
[Pipeline] [HOST3_security_tools] echo
[HOST3_security_tools] [tripwire, tripwire, tripwire]
[Pipeline] [HOST3_security_tools] }
[Pipeline] [HOST4_security_tools] echo
[HOST4_security_tools] [tripwire, tripwire, tripwire, tripwire]
[Pipeline] [HOST4_security_tools] }
[Pipeline] [HOST5_security_tools] echo
[HOST5_security_tools] [tripwire, tripwire, tripwire, tripwire, tripwire]
[Pipeline] [HOST5_security_tools] }
[Pipeline] [HOST6_security_tools] echo
[HOST6_security_tools] [tripwire, tripwire, tripwire, tripwire, tripwire, tripwire]
[Pipeline] [HOST6_security_tools] }
[Pipeline] [HOST7_security_tools] echo
[HOST7_security_tools] [tripwire, tripwire, tripwire, tripwire, tripwire, tripwire, tripwire]
[Pipeline] [HOST7_security_tools] }
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
如您所见,它似乎使用的是“相同”列表。但是,如果我添加sleep
(val
是一个随机 int <= 10)
def ansibleSecurityTools(server, val){
println("Clone Security Playbook")
sleep(val)
println("Download Ansible galaxy requirements")
skipTags = []
for (st in server.server.security_tools) {
if (!st.value)
skipTags.add(st.key.toLowerCase())
}
println(skipTags)
}
结果发生变化,打印正确,有些则不正确。这些结果会随着每次执行而随机变化。
例如,这一次我首先得到了我的预期。
Running on slave in /home/vagrant/jenkins/workspace/eac
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Parse Info from Server YAML)
[Pipeline] readYaml
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Run Terraform)
[Pipeline] echo
Placeholder
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Security Tools)
[Pipeline] parallel
[Pipeline] [HOST1_security_tools] { (Branch: HOST1_security_tools)
[Pipeline] [HOST2_security_tools] { (Branch: HOST2_security_tools)
[Pipeline] [HOST3_security_tools] { (Branch: HOST3_security_tools)
[Pipeline] [HOST4_security_tools] { (Branch: HOST4_security_tools)
[Pipeline] [HOST5_security_tools] { (Branch: HOST5_security_tools)
[Pipeline] [HOST6_security_tools] { (Branch: HOST6_security_tools)
[Pipeline] [HOST7_security_tools] { (Branch: HOST7_security_tools)
[Pipeline] [HOST1_security_tools] echo
[HOST1_security_tools] Clone Security Playbook
[Pipeline] [HOST1_security_tools] sleep
[HOST1_security_tools] Sleeping for 3 sec
[Pipeline] [HOST2_security_tools] echo
[HOST2_security_tools] Clone Security Playbook
[Pipeline] [HOST2_security_tools] sleep
[HOST2_security_tools] Sleeping for 5 sec
[Pipeline] [HOST3_security_tools] echo
[HOST3_security_tools] Clone Security Playbook
[Pipeline] [HOST3_security_tools] sleep
[HOST3_security_tools] Sleeping for 2 sec
[Pipeline] [HOST4_security_tools] echo
[HOST4_security_tools] Clone Security Playbook
[Pipeline] [HOST4_security_tools] sleep
[HOST4_security_tools] Sleeping for 9 sec
[Pipeline] [HOST5_security_tools] echo
[HOST5_security_tools] Clone Security Playbook
[Pipeline] [HOST5_security_tools] sleep
[HOST5_security_tools] Sleeping for 6 sec
[Pipeline] [HOST6_security_tools] echo
[HOST6_security_tools] Clone Security Playbook
[Pipeline] [HOST6_security_tools] sleep
[HOST6_security_tools] Sleeping for 8 sec
[Pipeline] [HOST7_security_tools] echo
[HOST7_security_tools] Clone Security Playbook
[Pipeline] [HOST7_security_tools] sleep
[HOST7_security_tools] Sleeping for 5 sec
[Pipeline] [HOST3_security_tools] echo
[HOST3_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST3_security_tools] echo
[HOST3_security_tools] [tripwire]
[Pipeline] [HOST3_security_tools] }
[Pipeline] [HOST1_security_tools] echo
[HOST1_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST1_security_tools] echo
[HOST1_security_tools] [tripwire]
[Pipeline] [HOST1_security_tools] }
[Pipeline] [HOST2_security_tools] echo
[HOST2_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST2_security_tools] echo
[HOST2_security_tools] [tripwire]
[Pipeline] [HOST2_security_tools] }
[Pipeline] [HOST7_security_tools] echo
[HOST7_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST7_security_tools] echo
[HOST7_security_tools] [tripwire]
[Pipeline] [HOST7_security_tools] }
[Pipeline] [HOST5_security_tools] echo
[HOST5_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST5_security_tools] echo
[HOST5_security_tools] [tripwire]
[Pipeline] [HOST5_security_tools] }
[Pipeline] [HOST6_security_tools] echo
[HOST6_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST6_security_tools] echo
[HOST6_security_tools] [tripwire]
[Pipeline] [HOST6_security_tools] }
[Pipeline] [HOST4_security_tools] echo
[HOST4_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST4_security_tools] echo
[HOST4_security_tools] [tripwire]
[Pipeline] [HOST4_security_tools] }
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
但是,再次运行完全相同的事情会导致不同的结果。
Running on slave in /home/vagrant/jenkins/workspace/eac
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Parse Info from Server YAML)
[Pipeline] readYaml
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Run Terraform)
[Pipeline] echo
Placeholder
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Security Tools)
[Pipeline] parallel
[Pipeline] [HOST1_security_tools] { (Branch: HOST1_security_tools)
[Pipeline] [HOST2_security_tools] { (Branch: HOST2_security_tools)
[Pipeline] [HOST3_security_tools] { (Branch: HOST3_security_tools)
[Pipeline] [HOST4_security_tools] { (Branch: HOST4_security_tools)
[Pipeline] [HOST5_security_tools] { (Branch: HOST5_security_tools)
[Pipeline] [HOST6_security_tools] { (Branch: HOST6_security_tools)
[Pipeline] [HOST7_security_tools] { (Branch: HOST7_security_tools)
[Pipeline] [HOST1_security_tools] echo
[HOST1_security_tools] Clone Security Playbook
[Pipeline] [HOST1_security_tools] sleep
[HOST1_security_tools] No need to sleep any longer
[Pipeline] [HOST2_security_tools] echo
[HOST2_security_tools] Clone Security Playbook
[Pipeline] [HOST2_security_tools] sleep
[HOST2_security_tools] Sleeping for 9 sec
[Pipeline] [HOST3_security_tools] echo
[HOST3_security_tools] Clone Security Playbook
[Pipeline] [HOST3_security_tools] sleep
[HOST3_security_tools] Sleeping for 9 sec
[Pipeline] [HOST4_security_tools] echo
[HOST4_security_tools] Clone Security Playbook
[Pipeline] [HOST4_security_tools] sleep
[HOST4_security_tools] Sleeping for 7 sec
[Pipeline] [HOST5_security_tools] echo
[HOST5_security_tools] Clone Security Playbook
[Pipeline] [HOST5_security_tools] sleep
[HOST5_security_tools] Sleeping for 3 sec
[Pipeline] [HOST6_security_tools] echo
[HOST6_security_tools] Clone Security Playbook
[Pipeline] [HOST6_security_tools] sleep
[HOST6_security_tools] Sleeping for 5 sec
[Pipeline] [HOST7_security_tools] echo
[HOST7_security_tools] Clone Security Playbook
[Pipeline] [HOST7_security_tools] sleep
[HOST7_security_tools] Sleeping for 3 sec
[Pipeline] [HOST1_security_tools] echo
[HOST1_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST1_security_tools] echo
[HOST1_security_tools] [tripwire]
[Pipeline] [HOST1_security_tools] }
[Pipeline] [HOST5_security_tools] echo
[HOST5_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST5_security_tools] echo
[HOST5_security_tools] [tripwire]
[Pipeline] [HOST5_security_tools] }
[Pipeline] [HOST7_security_tools] echo
[HOST7_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST7_security_tools] echo
[HOST7_security_tools] [tripwire]
[Pipeline] [HOST7_security_tools] }
[Pipeline] [HOST6_security_tools] echo
[HOST6_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST6_security_tools] echo
[HOST6_security_tools] [tripwire]
[Pipeline] [HOST6_security_tools] }
[Pipeline] [HOST4_security_tools] echo
[HOST4_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST4_security_tools] echo
[HOST4_security_tools] [tripwire]
[Pipeline] [HOST4_security_tools] }
[Pipeline] [HOST2_security_tools] echo
[HOST2_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST3_security_tools] echo
[HOST3_security_tools] Download Ansible galaxy requirements
[Pipeline] [HOST2_security_tools] echo
[HOST2_security_tools] [tripwire]
[Pipeline] [HOST2_security_tools] }
[Pipeline] [HOST3_security_tools] echo
[HOST3_security_tools] [tripwire, tripwire]
[Pipeline] [HOST3_security_tools] }
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
我可能在这里遗漏了与 Jenkins 中的 Java/Groovy 并发或并行性相关的内容吗?
非常感谢,
解决方案
推荐阅读
- markdown - 如何在 Atom 中创建文件链接?
- react-native - React Native 样式问题
- discord.js - 将数字转换为 gif 表情符号
- javascript - 从 LitElement Web 组件中检索属性数据
- php - htaccess 使用获取参数重写和重定向
- ios - WKWebView dealloc 的 EXC_BAD_ACCESS KERN_INVALID_ADDRESS
- python - 使用文件和字典时在 python 中出现错误“不可散列的类型列表”
- swift - UITableView 使用 Realm 和 Swift 按字母顺序排列多个部分,多个标签连接相同的数据
- c - 如何将数组中的uint8和uint16字节与arduino结合起来?
- javascript - 您应该在 vb.net 应用程序中的哪个文件夹中放置 vb.net 应用程序专用的 html 文件?