cirandas.net

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