首页 > 解决方案 > 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 并发或并行性相关的内容吗?

非常感谢,

标签: jenkinsgroovyconcurrencyjenkins-pipeline

解决方案


推荐阅读