Jenkins - 运行 单个作业同时处理两个节点 - 或者在两个作业之间相互通信

Jenkins - Running a single job addressing two nodes simultaneous - or intercommunicate between two jobs

Jenkins 新手,但有其他构建服务器的经验。

我正在设置一个测试作业,其中两个节点上的软件需要相互来往。 我有一个标记节点池(我们称它们为 A,运行ning windows 7)到 运行 测试软件和另一个标记节点池(我们称它们为 B,运行ning lubuntu 14.10).

测试是通过TCP/IP执行的,并且在整个测试过程中需要在 A 和 B 节点上进行各种命令行刺激。最后我需要从 A 和 B 节点收集工件。

我想同时控制多个节点的要求和需要并不少见,但我真的很难在网上找到这方面的信息。
可能有我错过的插件吗?


如果没有一个插件可以帮助我,下面是我对执行者需要什么的想法。

我的首选解决方案是单一作业,但我需要了解如何执行以下操作:

  1. 从 SVN 检出到节点 A。
  2. 从 SVN 签出到节点 B。
  3. 在节点 A 上执行 Windows 脚本。
  4. 在节点 B 上执行 Linux 脚本。
  5. 从节点 A 收集神器。
  6. 从节点 B 收集工件。

替代上述所有偶数项目符号,可能是使用 SSH 从主节点或 A 节点执行这些操作以控制 B 节点,但这留下了以下问题:

  1. 如何select 从 B 节点池中取出一个 B 节点 - 并将其标记为已使用?
  2. 如何使用 Jenkins SSH/slave 凭据?



一个完全不同的替代方案可能是设置两个作业,一个用于节点 A,一个用于节点 B。但随后我需要了解如何执行以下操作:

  1. 将一个节点 A 作业与一个节点 B 作业相关联,这样它们都知道该关联。
  2. 进行双向互通,让Node A作业等待Node B作业的信号和签证。

热切期待您的解答!

在我们使用的类似场景中,我们有两个作业(我不知道在两个节点上 运行 一个作业的方法)。
Job A​​ 运行s on node A​​ 并设置服务器然后触发job B,在节点 B 上设置为 运行(作为构建步骤)。
作业 B 将启动其客户端应用程序,该应用程序配置为与 A​​ 安装的服务器一起工作(在我的例子中是 IP 配置)。
作业 A​​(服务器)进入等待循环(使用 bash while)检查客户端 运行ning 是否在 B 已连接(我在共享位置使用标志文件)。

连接后,两个作业都需要执行更多步骤并完成。每个作业都将以其自己的报告结束。

希望对您有所帮助。

在我的例子中,我使用 Multi-configuration project with Slave axis. Then you can synchronize execution between nodes using your own code, or mix it with (system) Groovy script 在不同配置之间进行通信。

即。

def siblings = [] 

build.getParentBuild().getExactRuns().each { run ->
    if (!build.is(run)) {

        if (run.hasntStartedYet()) {
            println "Build " + name + " hasn't started yet!"
        } else {
            if (!run.isBuilding()) {
                println "Build " + name + " has already completed!"
                break
            }

            executor = run.getExecutor()
            if (executor) {
                hostname = executor.getOwner().getHostName()

                // In case hostname could not be found explicitly,
                // then set it based on node's name.
                if (!hostname) hostname = executor.getOwner().getName()

                if (hostname) {
                    siblings.add(hostname)
                }
            }
        }
    }
}