vagrant-rspec-ci 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # vagrant-rspec-ci
2
+
3
+ **vagrant-rspec-ci** is a Vagrant plugin for running integration tests against
4
+ your VMs, and produces jUnit formatted reports for consumption by your CI server
5
+ (travis and Jenkins and both can consume this).
6
+
7
+ It is based on a fork of Michael Paul Thomas Conigliaro's vagrant-test plugin, with
8
+ some (very) breaking changes to make it rpsec-specific and integrate better with ci_reporter
9
+ (the jUnit report formatter). I also removed the internal side of testing, as we didn't
10
+ want to alter the test subject (by installing rspec internally in the VM, for example)
11
+
12
+ ## Installation (Vagrant v1.0.x)
13
+
14
+ vagrant gem install vagrant-rspec-ci
15
+
16
+ ## Configuration
17
+
18
+ The following options can be used within the `Vagrant::Config.run` block of
19
+ your Vagrantfile:
20
+
21
+ <table>
22
+ <tr>
23
+ <th>Option</th>
24
+ <th>Description</th>
25
+ <th>Default value</th>
26
+ </tr>
27
+ <tr>
28
+ <td>config.rspec.enable_ci_reporter</td>
29
+ <td>Boolean - whether to use ci_reporter to format rspec results as jUnit reports.</td>
30
+ <td>true</td>
31
+ </tr>
32
+ <tr>
33
+ <td>config.rspec.suppress_ci_stdout</td>
34
+ <td>ci_reporter improperly registers as a formatter, writes to files, but leaves the doc formatter in place. This makes for very noisy output. Set to true (default) to send all STDOUT formatter output from rspec to /dev/null ; set to false when diagnosing a problem, or if you like noise.</td>
35
+ <td>true</td>
36
+ </tr>
37
+
38
+ <tr>
39
+ <td>config.rspec.dirs</td>
40
+ <td>Array of directories (relative to vagrant project root) to be used as a search path for external tests.</td>
41
+ <td>['combined/spec_ext", "spec"]</td>
42
+ </tr>
43
+ <tr>
44
+ <td>config.rspec.tests</td>
45
+ <td>List of tests (filenames or globs, expanded in the dirs paths) to be run outside the VM</td>
46
+ <td>[ '*ext_spec.rb' ]</td>
47
+ </tr>
48
+ <tr>
49
+ <td>config.rspec.rspec_bin_path</td>
50
+ <td>Path to rspec command, on VM host</td>
51
+ <td>"rspec"</td>
52
+ </tr>
53
+ <tr>
54
+ <td>config.rspec.reports_dir</td>
55
+ <td>If ci_reporter is enabled, path to write the jUnit XML reports. Relative to vagrant project dir.</td>
56
+ <td>"rspec_reports"</td>
57
+ </tr>
58
+
59
+ ## Usage
60
+
61
+ vagrant rspec [vm-name]
62
+
63
+ ## Change Log
64
+
65
+ ### 0.0.1 (2013-04-09)
66
+
67
+ * Forked from v0.1.2 of vagrant-test
68
+
69
+ ## License
70
+
71
+ Copyright (C) 2013 Clinton Wolfe
72
+
73
+ Copyright (C) 2012 Michael Paul Thomas Conigliaro
74
+
75
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
76
+ this software and associated documentation files (the "Software"), to deal in
77
+ the Software without restriction, including without limitation the rights to
78
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
79
+ of the Software, and to permit persons to whom the Software is furnished to do
80
+ so, subject to the following conditions:
81
+
82
+ The above copyright notice and this permission notice shall be included in all
83
+ copies or substantial portions of the Software.
84
+
85
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
86
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
87
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
88
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
89
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
90
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
91
+ SOFTWARE.
92
+
93
+ ## Credits
94
+
95
+ * [Clinton Wolfe](http://ccwolfe.com): Derivative author of vagrant-rspec-ci
96
+
97
+ * [Michael Paul Thomas Conigliaro](http://conigliaro.org): Original author of vagrant-test
@@ -0,0 +1,33 @@
1
+ require "rubygems"
2
+
3
+ require "vagrant"
4
+ require "vagrant/util/subprocess"
5
+ require "vagrant-rspec-ci/config"
6
+ require "vagrant-rspec-ci/command"
7
+
8
+
9
+
10
+ require "pry-debugger"
11
+
12
+ module VagrantRspecCI
13
+
14
+ NAME = "vagrant-rspec-ci"
15
+ VERSION = "0.0.1"
16
+ AUTHOR = "Clinton Wolfe"
17
+ AUTHOR_EMAIL = "clintoncwolfe [at] gmail [dot] com"
18
+ DESCRIPTION = "vagrant-rspec-ci is a Vagrant plugin for running tests against your VMs, derived from vagrant-test"
19
+ URL = "http://github.com/clintoncwolfe/vagrant-rspec-ci"
20
+
21
+ V_ROOT = "/vagrant"
22
+
23
+
24
+ DEFAULT_RSPEC_BIN_PATH = "rspec"
25
+ DEFAULT_REPORTS_DIR = "rspec_reports"
26
+ DEFAULT_DIRS = [ "combined/spec_ext", "spec" ]
27
+ DEFAULT_TESTS = [ "*spec.rb" ]
28
+
29
+
30
+ end
31
+
32
+ Vagrant.config_keys.register(:rspec) { VagrantRspecCI::Config }
33
+ Vagrant.commands.register(:rspec) { VagrantRspecCI::Command }
@@ -0,0 +1,93 @@
1
+ module VagrantRspecCI
2
+
3
+ class Command < Vagrant::Command::Base
4
+
5
+ def execute
6
+ opts = OptionParser.new do |opts|
7
+ opts.banner = "Usage: vagrant rpsec [vm-name]"
8
+ end
9
+
10
+ argv = parse_options(opts)
11
+ return if !argv
12
+
13
+ with_target_vms(argv[0]) do |vm|
14
+ vm.env.action_runner.run(Vagrant::Action::General::Validate, {:vm=>vm, :ui=>vm.ui})
15
+
16
+ if !vm.created? || vm.state != :running
17
+ vm.ui.error("VM not running. Not running tests.")
18
+ else
19
+
20
+ tests = expand_test_list(vm.config.rspec)
21
+ cmd = rspec_command(vm)
22
+ tests.each do |testfile|
23
+ vm.ui.info("Running rspec test: #{testfile}")
24
+ cmd = "#{cmd} #{testfile}"
25
+ @logger.debug("Command: #{cmd}")
26
+ system({ "CI_REPORTS" => vm.config.rspec.reports_dir } , cmd)
27
+ result = $?
28
+ # rspec exits 0 if all passed, 1 if some failed - and system gives nil if there was a problem starting the process
29
+ if result.nil? then
30
+ vm.ui.error "Unable to execute rspec command: #{$!} \n #{cmd}"
31
+ elsif result.exitstatus == 1 then
32
+ vm.ui.warn "Rspec test #{testfile} has at least one failure - see report output for details"
33
+ elsif result.exitstatus == 0 then
34
+ vm.ui.success "Rspec test #{testfile} passed"
35
+ else
36
+ vm.ui.error "Unrecognized exit code from rspec: #{result.exitstatus}\nfor:#{cmd}"
37
+ end
38
+ end
39
+
40
+ if tests.empty?
41
+ vm.ui.info("No rspec tests found.")
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+
48
+ private
49
+ def expand_test_list (rspec_config)
50
+ tests = rspec_config.tests.map { |filespec|
51
+ rspec_config.dirs.find_all { |dir| File.directory?(dir) }.map { |dir|
52
+ Dir.glob(File.join(dir, filespec))
53
+ }
54
+ }.flatten.uniq
55
+ end
56
+
57
+ def rspec_command (vm)
58
+ # Use gemset provided by Vagrant
59
+ # Cribbed from https://github.com/mitchellh/vagrant/blob/1-0-stable/lib/vagrant/command/gem.rb
60
+ ENV['GEM_HOME'] = vm.env.gems_path.to_s
61
+ ::Gem.clear_paths
62
+
63
+ use_cir = vm.config.rspec.enable_ci_reporter
64
+
65
+ # Find ci_reporter rspec hook
66
+ if use_cir then
67
+ ci_hook_candidates = ::Gem.find_files('ci/reporter/rake/rspec_loader')
68
+
69
+ # TODO - bad assumption here, but if we find more than one, let's assume we can sort them and use the latest version.
70
+ ci_hook_path = (ci_hook_candidates.sort)[-1]
71
+
72
+ unless ci_hook_path then
73
+ raise "Could not find ci_reporter rspec hook - I expect ci_reporter to be installed as a gem under vagrant!"
74
+ end
75
+ end
76
+
77
+ # Find rspec
78
+ # TODO - even when you install it as a vagrant gem, it is not present in ::Gem.bindir :(
79
+ # Cross fingers?
80
+ rspec_path = vm.config.rspec.rspec_bin_path
81
+
82
+ cmd = ""
83
+ cmd << rspec_path
84
+ cmd << (use_cir ? " --require " + ci_hook_path + " --format CI::Reporter::RSpec" : "")
85
+ cmd << (use_cir && vm.config.rspec.suppress_ci_stdout ? " -o /dev/null " : "")
86
+ cmd << vm.config.rspec.dirs.map{ |d| " -I #{d}" }.join('')
87
+
88
+ cmd
89
+ end
90
+
91
+ end
92
+
93
+ end
@@ -0,0 +1,58 @@
1
+ module VagrantRspecCI
2
+
3
+ class Config < Vagrant::Config::Base
4
+
5
+ attr_writer :enable_ci_reporter,
6
+ :suppress_ci_stdout,
7
+ :rspec_bin_path,
8
+ :reports_dir,
9
+ :dirs,
10
+ :tests
11
+
12
+ def enable_ci_reporter
13
+ @enable_ci_reporter.nil? ? true : @enable_ci_reporter
14
+ end
15
+
16
+ def suppress_ci_stdout
17
+ @suppress_ci_stdout.nil? ? true : @suppress_ci_stdout
18
+ end
19
+
20
+ def rspec_bin_path
21
+ @rpsec_bin_path || DEFAULT_RSPEC_BIN_PATH
22
+ end
23
+
24
+ def reports_dir
25
+ @reports_dir || DEFAULT_REPORTS_DIR
26
+ end
27
+
28
+ def dirs
29
+ @dirs || DEFAULT_DIRS
30
+ end
31
+
32
+ def tests
33
+ @tests || DEFAULT_TESTS
34
+ end
35
+
36
+ def validate(env, errors)
37
+
38
+ [
39
+ :dirs,
40
+ :tests,
41
+ ].each do |thing_sym|
42
+ # Each of these should be an array or enumerable.
43
+ value = self.send(thing_sym)
44
+ unless value.respond_to?(:each) then
45
+ errors.add("config.rspec.#{thing_sym} should be an array")
46
+ return
47
+ end
48
+ end
49
+
50
+ # Must find at least one of the directory defaults
51
+ edir = self.dirs.find {|d| File.directory?(d) }
52
+ errors.add("No test directory found - candidates: #{self.dirs.join(',')}") unless edir
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1 @@
1
+ require "vagrant-rspec-ci"
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-rspec-ci
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Clinton Wolfe
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: vagrant
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.9.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: vagrant-rspec-ci is a Vagrant plugin for running tests against your VMs,
47
+ derived from vagrant-test
48
+ email: clintoncwolfe [at] gmail [dot] com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - README.md
54
+ - lib/vagrant_init.rb
55
+ - lib/vagrant-rspec-ci/command.rb
56
+ - lib/vagrant-rspec-ci/config.rb
57
+ - lib/vagrant-rspec-ci.rb
58
+ homepage: http://github.com/clintoncwolfe/vagrant-rspec-ci
59
+ licenses: []
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project: vagrant-rspec-ci
78
+ rubygems_version: 1.8.24
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: vagrant-rspec-ci is a Vagrant plugin for running tests against your VMs,
82
+ derived from vagrant-test
83
+ test_files: []