Ruby 如何并行执行Rake任务

Ruby 如何并行执行Rake任务,ruby,cucumber,rake,Ruby,Cucumber,Rake,我需要同时在多个设备和模拟器上运行cumber测试。虽然我能够在詹金斯中使用多个工作并将其参数化,但我不认为这是最好的方法,因为将来我们可以增加更多的设备,而我不希望在詹金斯中有无尽的工作。 当我尝试使用rake任务时,我发现它是按顺序执行的,而不是并行执行的 以下是两个rake任务: def run_cucumber(profile) Cucumber::Rake::Task.new do |t| t.profile = profile end Rake::MultiTas

我需要同时在多个设备和模拟器上运行cumber测试。虽然我能够在詹金斯中使用多个工作并将其参数化,但我不认为这是最好的方法,因为将来我们可以增加更多的设备,而我不希望在詹金斯中有无尽的工作。 当我尝试使用rake任务时,我发现它是按顺序执行的,而不是并行执行的

以下是两个rake任务:

def run_cucumber(profile)
  Cucumber::Rake::Task.new do |t|
    t.profile = profile
  end
  Rake::MultiTask[:cucumber].invoke
end

task 'Device1' do |t|
  run_cucumber('MotoZ2Play')
end
task 'Device2' do |t|
  run_cucumber('MotoG5Plus')
end
下面是我如何使用
多任务

multitask 'build_parallel' => ['Device1', 'Device2']
这似乎再次不是并行执行,而是按顺序执行

我尝试使用以下代码实现并行测试:

Parallel.map([:Device1,:Device2,:Device3,:Device4,:Device5]) {|task| Rake::Task[task].invoke }
但在我的cucumber特性文件中,这似乎是执行随机场景,我们希望按照我们编写的顺序执行场景

如何实现并行rake任务

更新:

通过使用
Parallel.each
而不是
Parallel.map

有一个名为
Parallel\u tests
的gem,它允许您创建自定义rake任务并并行运行它们。 您还可以指定要使用的CPU数量

下面是我刚刚做的一些简单的例子:

namespace :my_task do
  task :a => :environment do
    100.times {
      puts "A"
    }
  end

  task :b => :environment do
    100.times {
      puts "B"
    }
  end

  task :c => :environment do
    Rake::Task["my_task:a"].execute
    Rake::Task["my_task:b"].execute
  end
end

输出类似于smthg:


B
B
B
B
A
A
B
B
B
B
B
B
B
B
B
B
A
A
A
A
A
A
...
我希望这有帮助


Cheers

最好的解决方案是使用
drake
gem,它是
rake
的分支,增加了并发支持。我不知道为什么
multitask
对您不起作用,但主要的问题是您无法指定要运行Rakefile的并发量。使用drake,您可以通过-j选项。它类似于
make
的s-j选项

安装时使用:

 gem install drake
假设您有一个像这样的耙子:

task :a do
  sleep 5
  puts "a"
end
如果运行
drake-j2
,那么它将以2的并发性运行,因此“a”和“b”将在5s后同时打印

但如果运行
drake
(或
drake-j1
),则在5s后只会看到“a”,然后在另一个5s后会看到“b”


德雷克不再被维护,但它仍然工作得很好。我已经用它开发Phusion Passen 8年了。

老实说,我迷路了。“并行”和“按照我们编写的顺序”是不可能同时实现的,这些目标相互矛盾。我想你弄错了,按照我们编写的顺序,我的意思不是“按照我们希望它运行的顺序”,而是指一组场景(测试用例)在所有并行设备中逐个执行。例如:我有两个rake X和Y中的测试用例A、B、C、D、E,我希望这些X和Y并行运行执行A、B、C、D、E而不是E、B、C、A、D。这个问题有点误导,因为您已经知道如何并行运行rake任务。如果您可以从一个ruby线程生成多个设备实例,那么您可以让每个测试用例为每个设备并行运行其代码。。如果需要,您不一定需要并行运行整个rake任务sense@maxpleaner这实际上让我将
parallel.each([:Device1,:Device2])
而不是
parallel.map
,从而根据需要跨设备生成实例。谢谢有了它的工作:)在这里添加一点额外的想法。在Jenkins中,不确定是哪个版本引入了它,但现在可以在节点上运行并行任务了。这意味着您正在使用1个执行器,在该执行器中的节点上运行多个线程。当然,您需要注意您正在运行的任务数量,因为您可能会使执行器过载。另一个选项是Jenkins作业可以在不同的从机上启动x个作业,比如AWS中的EC2实例,每个实例都有自己定义的配置。谢谢!我很快就会试试这个!谢谢我要试试这个。这似乎是一个更合适的解决方案,不再严重依赖外部库。确切地说,它过去基本上用于加速测试套件,但作者为在其他一些情况下使用它留下了空间,例如在这种情况下。它在几个方面为我们做得很好。