【问题标题】:"Serialize" Bamboo builds?“序列化” Bamboo 构建?
【发布时间】:2011-10-26 09:22:51
【问题描述】:

我们使用 Bamboo v3.1.1 作为我们的持续集成构建服务器,它运行良好 - 大多数时候。

我们遇到的一个问题是我们正在进行大量面向数据库的测试,例如构建在共享数据库实例上进行一些单元和集成测试。

当我们碰巧同时运行同一个构建计划的多个 Bamboo 构建时,这会导致问题 - 它们相互绊脚并导致死锁,通常,所有涉及的构建都会因此而失败。

因此,虽然并行构建非常棒 - 在理论上 - 我们真的希望能够定义一个构建计划来“序列化”构建,例如永远不要并行执行多个构建。

有谁知道我们该怎么做?是否有设置告诉 Bamboo“不要并行化这个构建计划 - 一次只做一个构建,以串行方式”

更新:

我的构建过程目前有两个阶段:

  • 核心构建(构建 VS 解决方案,将测试数据库更新为最新脚本)
  • 测试(NUnit 2.4)

“核心构建”可以轻松地并行运行多次 - 没有问题。但是,“测试”阶段不能运行多次,因为其中一些测试访问的是唯一共享的“单元测试”数据库;如果超过 1 个“测试”阶段进程正在运行,它们最终会相互死锁。

那么我如何告诉 Bamboo 可以并行化“核心构建”阶段,但对于“测试”,无论有多少构建正在运行,始终一次只运行 一个实例 ??

【问题讨论】:

    标签: unit-testing bamboo parallel-builds


    【解决方案1】:

    我的方法是将核心构建放在一个计划中,将测试放在另一个计划中。 core build 将触发 testing 计划作为子计划。

    然后,一旦核心构建完成,就会产生一个测试计划。

    核心构建计划大概可以设置为在多台机器上并行运行多个实例。 测试计划将被限制为一次运行的计划的单个实例。

    我唯一的困惑是你说:

    • 核心构建

      (构建 VS 解决方案,将测试数据库更新为最新脚本

    更新测试数据库不会导致正在运行的测试计划出现问题吗?

    【讨论】:

    • 感谢您的建议 - 很有趣。但主要问题仍然存在:如何我会告诉该测试计划它只能“一次运行一个”吗?另外:关于数据库更新的要点 - 我将不得不进行更多调查......
    • 计划默认一次只运行一个,除非您启用并增加服务器范围内的默认并发构建数。即使在这种情况下,您也可以将计划配置为仅同时运行自身的 1 个实例。它位于计划的其他选项卡下。
    • 很有趣 - 谢谢!想知道为什么我们的 Atlassian 大师从未告诉我这件事 :-)
    • 天哪 - 这太简单了...... 但它完美无瑕!非常感谢 - 你让我很开心(我的团队也很开心!)
    【解决方案2】:

    是的。有两种方法可以做到这一点:任务和阶段。我的猜测是你想要阶段。

    要让您的构建并行运行,您必须在一个阶段内运行多个作业。如果您将无法并行运行的作业放在不同的阶段,它们将串行运行。例如,如果您有:

    Test Foo Stage:
        Init Foo Database Job
        Hammer Foo Database Job
        Smash Foo Database Job
    Test Baz Stage:
        Init Baz Database Job
        Bamboozle Baz Database Job
        Befuddle Baz Database Job
    

    然后 foo 阶段的 Init/Hammer/Smash 将有问题地并行运行。但是,您可以将每个放在自己的阶段:

    Test Foo Init Stage:
        Init Foo Database Job
    Test Foo Hammer Stage:
        Hammer Foo Database Job
    Test Foo Smash Stage:
        Smash Foo Database Job
    Test Baz Init Stage:
        Init Baz Database Job
    Test Baz Bamboozle Stage:
        Bamboozle Baz Database Job
    Test Baz Befuddle Stage:
        Befuddle Baz Database Job
    

    然后,每个任务将串行运行,而不是并行运行。当然,这实际上将您限制在一个有用的代理上。

    如果您真的只想使用单个代理,您始终可以禁用除一个代理之外的所有代理,但这会影响所有构建,因此如果您希望任何东西并行运行,这不是一个好主意。

    作为最后的评论,你也可以通过任务而不是阶段来到达你想要的地方。连接每个 Job 的任务,它们将由单个代理串行运行。当然,每个任务都会看到前一个任务中更改的文件和状态,因此您需要确保它们不会干扰。

    【讨论】:

    • 我突然想到我的经验是使用比您列出的更新版本的 Bamboo。您可能必须在我的建议前加上“升级到较新版本的 Bamboo”才能使用其中的一些功能。
    • 好的,所以我需要将“构建”与“测试”阶段分开 - 但我如何确保当两个进程同时开始构建时,两个进程不会同时运行进入“测试”阶段??大多数时候,我们有 3-5 个构建代理可用。我可以将“测试”阶段限制为只有一个构建代理吗??
    • 不用担心 - Bamboo 3.1.1 已经有阶段,我知道这个词 :-)
    • 如果测试阶段使用不同的可执行文件,您可以从代理的共享功能列表中删除该可执行文件,并将其作为代理特定功能添加到单个代理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多