ref: master
lib/tasks/ci.rake
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
namespace :ci do desc 'Continuous integration smoke test' task :smoke do current_branch = `git rev-parse --abbrev-ref HEAD` if current_branch current_branch.strip! else fail 'Could not determine current branch. Is git installed?' end from = ENV['PREV_HEAD'] || "origin/#{current_branch}" if !system("git show-ref --verify --quiet refs/remotes/#{from}") from = 'origin/master' end to = ENV['HEAD'] || current_branch puts "Testing changes between #{from} and #{to} ..." changed_files = `git diff --name-only #{from}..#{to}`.split.select do |f| File.exist?(f) && f.split(File::SEPARATOR).first != 'vendor' end changed_plugin_files = changed_files.select do |f| f.split(File::SEPARATOR).first == 'plugins' end changed_plugins = changed_plugin_files.map do |f| f.split(File::SEPARATOR)[1] end.uniq changed_files -= changed_plugin_files # explicitly changed tests tests = changed_files.select { |f| f =~ /test\/.*_test\.rb$/ } features = changed_files.select { |f| f =~ /\.feature$/ } # match changed code files to their respective tests changed_files.each do |f| if f =~ /^(app|lib)\// basename = File.basename(f, '.rb') Dir.glob("test/**/#{basename}_test.rb").each do |t| tests << t unless tests.include?(t) end end if f =~ %r{^app/views/(\w*)/} controller = $1 t = "test/functional/#{controller}_controller_test.rb" tests << t if File.exists?(t) && !tests.include?(t) end end if tests.empty? && features.empty? && changed_plugins.empty? puts "Could not figure out specific changes to be tested in isolation!" puts "Assuming it's all good" end puts sh 'ruby', '-Itest', *tests unless tests.empty? sh 'cucumber', *features unless features.empty? sh 'xvfb-run', '-a', '--server-args="-screen 0, 1280x1024x24"', 'cucumber', '-p', 'selenium', *features unless features.empty? changed_plugins.each do |plugin| if $broken_plugins.include?(plugin) puts "Skipping plugins/#{plugin}: marked as broken" else task = "test:noosfero_plugins:#{plugin}" puts "Running #{task}" Rake::Task[task].execute end end end end |