Jenkins-如何处理使用有限资源池的并发作业?

Jenkins-如何处理使用有限资源池的并发作业?,jenkins,Jenkins,我正在努力改进工作中的一些测试程序,因为我不是詹金斯方面的专家,我希望你们能给我指出正确的方向?。 我们目前的情况是这样的。我们有一套庞大的E2E测试,定期运行。这些测试依赖于有限的资源池(用于运行每个测试的AWS VM)。我们有两套测试套件。这是一个全面的回归,在其高峰期,消耗了约80%的资源,而更轻的烟雾运行只消耗了15%左右 现在我用的是电脑。当测试运行步骤到来时,它将检查您是否正在运行回归,如果您正在运行回归,它将请求单锁。如果可用,则一切正常;如果不可用,则将等到可用后再继续。这使我能

我正在努力改进工作中的一些测试程序,因为我不是詹金斯方面的专家,我希望你们能给我指出正确的方向?。 我们目前的情况是这样的。我们有一套庞大的E2E测试,定期运行。这些测试依赖于有限的资源池(用于运行每个测试的AWS VM)。我们有两套测试套件。这是一个全面的回归,在其高峰期,消耗了约80%的资源,而更轻的烟雾运行只消耗了15%左右

现在我用的是电脑。当
测试运行
步骤到来时,它将检查您是否正在运行回归,如果您正在运行回归,它将请求单锁。如果可用,则一切正常;如果不可用,则将等到可用后再继续。这使我能够确保在同一点上运行的回归不会超过1次,但它有很多差距。例如,可能正在运行回归,并且可能会触发几个冒烟运行,这将耗尽资源池

我想在最佳情况场景中完成的是某种条件规则,它将根据以下内容决定测试执行步骤是否可以继续:

  • 同一时间只能运行一个回归
  • 如果正在运行回归,则只允许运行一次冒烟运行 平行
  • 如果没有运行回归,则最多允许5或6次冒烟测试
  • 如果正在运行2个或更多烟雾测试,则不允许回归到 发射
詹金斯管道能提供类似的服务吗?在本例中,我将使用声明性管道和一系列随时间推移而组合起来的帮助程序groovy代码。我的第一个想法是看看是否有办法检查一个可锁定的资源是否可用(但实际上还没有请求),然后通过一系列if/then/else来设置逻辑。但我也不确定是否有办法检查可锁定的资源状态,或者已经请求了多少这样的资源

老实说,这种复杂的事情可能超出了詹金斯应该处理的范围,但我不确定,我认为在这里提问将是一个好的开始


谢谢

使用构建单个作业的步骤创建声明性管道。不允许人们临时运行作业,或在将更改推送到存储库时,强制执行生成计划

这如何解决您的问题:

同一时间只能运行一个回归。

将所有这些作业按顺序放入声明性管道中

如果正在运行回归,则只允许并行运行一次冒烟运行。

将与回归测试相关的冒烟测试按顺序放置在回归构建之后,但在下一个回归构建之前并行运行冒烟测试

如果没有运行回归,则最多允许5或6次冒烟测试。

见前文

如果正在运行两个或多个冒烟测试,则不允许启动回归。

如果你按顺序做事,这永远不会发生

这是一张丑陋的图片,解释了我在说什么。

您可以手动创建管道,或使用blue ocean的coolness为您提供一个图形界面,以将步骤按顺序或并行进行:


缺点是,如果其中一个作业失败,它将停止构建,但是,如果作业高度相关,这不一定是坏事。

完全忘记了更新此内容,但在阅读了
可锁定资源插件并进行了更多实验后,我发现您可以在同一标签下拥有多个资源,并在特定作业启动时请求设置数量

我定义了5个资源,并设置了Jenkins文件来检查您是否使用参数
回归运行测试套件。如果您正在运行完全回归,它将尝试请求4个锁,而冒烟测试将仅尝试请求1个锁。这样,当没有足够的锁可用时,作业将等待,直到足够的锁可用或超时过期

以下是我的Jenkins文件中的一个片段:

        stage('Test') {
            steps {
                lock(resource: null, label: 'server-farm-tokens', quantity: getQuantityBySuiteType()) {
                  <<whatever I do to run my tests here>>
                }
            }
阶段(“测试”){
台阶{
锁(资源:null,标签:“服务器场令牌”,数量:getQuantityBySuiteType()){
}
}

resource
必须为空,因为Jenkin的声明性管道中有一个bug。如果您使用的是脚本化管道,则可以忽略该参数。

这很有意义,我可以在某些情况下使用该方法的变体,但我希望团队能够在需要时构建作业,而无需串联运行。My b最理想的结果是,任何人都可以进入Jenkins中的作业并运行它们,而无需考虑其他正在运行的任务,并让管道脚本处理这些任务。不过,这可能对Jenkins的要求太高了。而且,看不到您发送的图片=(.更新的图片。如果您限制作业,它们不会在需要的时候真正运行。因此,它仍然可能归结为某种日程安排、某些作业的静默期,或者增加服务器上的资源以允许空闲时间。