如何并行执行Rake任务

时间:2017-12-28 06:56:51

标签: ruby cucumber rake

我有黄瓜测试可以同时在多个设备和模拟器上运行。虽然我能够在jenkins中使用多个作业并对其进行参数化,但我不认为这是最好的方法,因为将来我们可以添加更多设备,而且我不希望在jenkins中有无尽的工作。

当我尝试使用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

以下是我使用multi task

启动Parallel rake的方法
multitask 'build_parallel' => ['Device1', 'Device2']

这似乎又不是并行执行,而是按顺序执行。

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

Parallel.map([:Device1,:Device2,:Device3,:Device4,:Device5]) {|task| Rake::Task[task].invoke }

但这似乎在我的黄瓜特征文件中执行随机场景,我们希望场景按照我们编写的顺序执行。

如何实现并行rake任务?

更新

通过使用解决它 Parallel.each代替Parallel.map

2 个答案:

答案 0 :(得分:1)

有一个名为parallel_tests https://github.com/grosser/parallel_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

输出类似于:


B
B
B
B
A
A
B
B
B
B
B
B
B
B
B
B
A
A
A
A
A
A
...

我希望有帮助。

欢呼

答案 1 :(得分:1)

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

安装方式:

 gem install drake

假设您有一个Rakefile,如下所示:

task :a do
  sleep 5
  puts "a"
end

如果您运行drake -j2,则它将以2并发运行,因此5秒钟后,“ a”和“ b”将同时打印。

但是,如果您运行drake(或drake -j1),则5s后将只看到“ a”,然后再5s后将看到“ b”。

Drake不再被维护,但是它仍然运行良好。我已经使用了8年的时间来开发Phusion Passenger。