serverspec_launcher 0.1.12 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 869e70e73b82b15d96dafe2b4f9a25adaca95beef038f421345b030a18c190d7
4
- data.tar.gz: 1b7020c969a27c0f6dbe9bb8f30b2cb4f70534f00f1f6862c961ed3946673f47
3
+ metadata.gz: c7f4e2ec421c549a1d9c00424757c4d14b671a53f7eec83b4628071f5554efd3
4
+ data.tar.gz: 903bd958354012b07b8896d3e82735a32900e08d450c875cc3ff3ea1070f3644
5
5
  SHA512:
6
- metadata.gz: 76b5ee6d396d148a019f9002571576991e60838f2278679c23a58b51de7abd0b11a5d0b68901521525b3414b0d61bd52550856ea0eaf52f039b9dc1ecacf7497
7
- data.tar.gz: 7da748e49339824c4c16f6a060c3056c3f06a229102f101d10ef25d44afe00185d5217595dabd3c435776019d93ddf77f29693c19f29ed174c09338a5450ee87
6
+ metadata.gz: 434da33e43b8a283af112b1c3cbeba59ebf9f0586bd7305c41110a08a03446b754837e475b51fd30033482b865ebb75828f98ab38cb93f93a432d3f58dec837f
7
+ data.tar.gz: 7399373d264ee5207366c1b68e9eab1ab5ef455eae67663d3fcb7516e15223a5eedcb2fb6318d0095d35c311570d7f676d67632b7752c7e0d868caea15b5c2ab
@@ -21,5 +21,10 @@ module SymbolizeHelper
21
21
  def deep_symbolize_keys
22
22
  SymbolizeHelper.symbolize_recursive(self)
23
23
  end
24
+
25
+ def deep_merge(second)
26
+ merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : Array === v1 && Array === v2 ? v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2 }
27
+ self.merge(second.to_h, &merger)
28
+ end
24
29
  end
25
30
  end
@@ -15,11 +15,10 @@ class ServerspecLauncherRakeTasks
15
15
  using SymbolizeHelper
16
16
 
17
17
  def initialize(properties = nil)
18
-
19
- @properties = properties ? properties : YAML.load_file('properties.yml')
18
+ @properties = properties ? properties.deep_symbolize_keys : YAML.load_file('properties.yml').deep_symbolize_keys
20
19
  options = @properties[:options] || {}
21
20
  @fail_on_err = options[:fail_on_err]
22
- @formatters = options[:formatters] || []
21
+ @formatters = options[:formatters] || ['docs_screen']
23
22
  @colorize = options[:color].nil? ? true : options[:color]
24
23
  end
25
24
 
@@ -29,27 +28,21 @@ class ServerspecLauncherRakeTasks
29
28
  debug_tasks
30
29
 
31
30
  namespace :serverspec do
32
- task all: @properties[:targets].keys.map { |key| 'serverspec:' + key.split('.')[0] }
33
- @properties[:targets].keys.each do |key|
34
- target = @properties[:targets][key]
35
- options = {
36
- fail_on_err: target[:fail_on_err] || @fail_on_err,
37
- formatters: target[:formatters] || @formatters,
38
- color: target[:color].nil? ? @colorize : target[:color]
39
- }
40
- spec_type = target[:spec_type] || 'role'
41
- if target[:hosts].is_a?(Array)
42
-
43
- task_array(key, spec_type, target, options)
44
- elsif target[:hosts]
45
- host = target[:hosts]
46
- task_name = (key || target[:name]).to_s
47
- rake_task(host, key, task_name, spec_type, options)
48
- else
49
- task_name = (key || target[:name]).to_s
50
- rake_task(key, key, task_name, spec_type, options)
31
+ targets = @properties[:targets] || {}
32
+ task all: targets.keys.map { |key| 'serverspec:' + key.to_s.split('.')[0] }
33
+ targets.keys.each do |key|
34
+ target = targets[key]
35
+ process_target(key, target)
36
+ end
37
+
38
+ environments = @properties[:environments] || {}
39
+ environments.keys.each do |key|
40
+ environment = environments[key]
41
+ environment[:targets].each do |target, hash|
42
+ process_target("#{key}:#{target}", hash)
51
43
  end
52
44
  end
45
+
53
46
  end
54
47
  end
55
48
 
@@ -67,10 +60,10 @@ class ServerspecLauncherRakeTasks
67
60
 
68
61
  def rake_task(host, key, task_name, spec_type, options = {})
69
62
  desc "Run serverspec to #{key}"
70
- RSpec::Core::RakeTask.new(host.split('.')[0].to_sym) do |t|
71
- ENV['TARGET_HOST'] = host
72
- ENV['TARGET'] = key
73
- ENV['TASK_NAME'] = task_name
63
+ RSpec::Core::RakeTask.new(host.to_s.split('.')[0].to_sym) do |t|
64
+ ENV['TARGET_HOST'] = host.to_s
65
+ ENV['TARGET'] = key.to_s
66
+ ENV['TASK_NAME'] = task_name.to_s
74
67
  t.pattern = "spec/#{spec_type}_spec.rb"
75
68
  t.fail_on_error = options[:fail_on_err]
76
69
  set_formatters(task_name, options, t)
@@ -100,7 +93,7 @@ class ServerspecLauncherRakeTasks
100
93
  if options[:formatters].include?('html')
101
94
  opts = "#{opts} --format html --out reports/#{key}.html"
102
95
  end
103
- if options[:formatters].include?('html_report')
96
+ if options[:formatters].include?('html_report') || options[:formatters].include?('html_pretty')
104
97
  opts = "#{opts} --format RspecHtmlReporter"
105
98
  end
106
99
  if options[:formatters].include?('json')
@@ -132,6 +125,28 @@ class ServerspecLauncherRakeTasks
132
125
  tasks = ServerspecLauncherRakeTasks.new properties
133
126
  tasks.load_tasks
134
127
  end
128
+
129
+ private
130
+
131
+ def process_target(key, target)
132
+ options = {
133
+ fail_on_err: target[:fail_on_err] || @fail_on_err,
134
+ formatters: target[:formatters] || @formatters,
135
+ color: target[:color].nil? ? @colorize : target[:color]
136
+ }
137
+ spec_type = target[:spec_type] || 'role'
138
+ if target[:hosts].is_a?(Array)
139
+
140
+ task_array(key, spec_type, target, options)
141
+ elsif target[:hosts]
142
+ host = target[:hosts]
143
+ task_name = (key || target[:name]).to_s
144
+ rake_task(host, key, task_name, spec_type, options)
145
+ else
146
+ task_name = (key || target[:name]).to_s
147
+ rake_task(key, key, task_name, spec_type, options)
148
+ end
149
+ end
135
150
  end
136
151
 
137
152
  ServerspecLauncherRakeTasks.load unless $dont_load_rake_tasks
@@ -13,12 +13,14 @@ require 'bundler'
13
13
  require 'specinfra'
14
14
 
15
15
  require 'serverspec_launcher/helpers/example_helper'
16
+ require 'serverspec_launcher/helpers/symbolize_helper'
16
17
 
17
18
  # Does all the setup fo r the serverspec tests
18
19
  class SpecHelper
19
20
  include ExampleHelper
21
+ using SymbolizeHelper
20
22
 
21
- attr_reader :properties
23
+ attr_reader :properties, :target_properties
22
24
  def initialize(host = ENV['TARGET_HOST'], target = ENV['TARGET'], properties = nil)
23
25
  @host = host
24
26
  @target = target
@@ -27,10 +29,19 @@ class SpecHelper
27
29
  end
28
30
 
29
31
  def load_properties(properties = nil)
30
- @properties = properties ? properties : YAML.load_file('properties.yml')
31
- @target_properties = @properties[:targets][@target]
32
+ @properties = properties ? properties.deep_symbolize_keys : YAML.load_file('properties.yml').deep_symbolize_keys
33
+ if @target.include? ':'
34
+ @target_properties = @properties[:environments][@target.split(':')[0].to_sym][:targets][@target.split(':')[1].to_sym]
35
+ else
36
+ @target_properties = @properties[:targets][@target.to_sym]
37
+ end
38
+
32
39
  @backend = @target_properties[:backend] || 'ssh'
33
40
  @target_properties[:target] = ENV['TASK_NAME']
41
+
42
+ @target_properties[:variables] = @properties[:variables] ? @properties[:variables].deep_merge(@target_properties[:variables]) : {}.deep_merge(@target_properties[:variables])
43
+ @target_properties[:environment] = @properties[:environment] ? @properties[:variables].deep_merge(@target_properties[:environment]) : {}.deep_merge(@target_properties[:environment])
44
+
34
45
  set_property @target_properties
35
46
  end
36
47
 
@@ -73,8 +84,6 @@ class SpecHelper
73
84
  { variable.to_sym => value }
74
85
  end.reduce({}, :merge)
75
86
  set :env, env
76
- set :env, 'LEEK' => 'SHEEK'
77
- puts env
78
87
  end
79
88
 
80
89
  def sudo_checks
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ServerspecLauncher
3
- VERSION = '0.1.12'
3
+ VERSION = '0.2.0'
4
4
  end
@@ -27,8 +27,11 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency 'rake', '~> 12.0'
28
28
  spec.add_development_dependency 'rspec', '~> 3.0'
29
29
  spec.add_development_dependency 'rubocop'
30
+ spec.add_development_dependency 'simplecov'
31
+ spec.add_development_dependency 'debase'
30
32
  spec.add_runtime_dependency 'serverspec'
31
33
  spec.add_runtime_dependency 'rspec_junit_formatter'
32
34
  spec.add_runtime_dependency 'rspec-tick-formatter', '0.1.3'
35
+ spec.add_runtime_dependency 'rspec_html_reporter', '~> 1.0.0'
33
36
  spec.add_runtime_dependency 'docker-api'
34
37
  end
@@ -1,29 +1,156 @@
1
1
  ---
2
- :targets:
3
- # ssh-example:
4
- # :hosts:
5
- # - raspberrypi
6
- # - blueberrypi
7
- # :user: pi
8
- # :roles:
9
- # - development::docker
10
- # exec-example:
11
- # :backend: exec
12
- # :roles:
13
- # - :name: development::ruby
14
- # :description: Ruby Development
15
- # - development::docker
16
- # docker-image-example:
17
- # :backend: docker
18
- # :docker_image: mongo
19
- # :roles:
20
- # - database::mongo
21
- # docker-container-examples:
22
- # :backend: docker
23
- # :docker_container: jenkins
24
- # :roles:
25
- # - build_tools::jenkins
26
- # vagrant-example:
27
- # :backend: vagrant
28
- # :roles:
29
- # - debug::environment_vars
2
+
3
+ options:
4
+ # Stop the test on the first failure (default: true)
5
+ fail_on_err: true
6
+ # Specify output format defaults is docs_screen multiple formatters can be specified
7
+ formaters:
8
+ # RSpec Documentation Formatter writing to file reports/<target>.docs
9
+ - docs
10
+ # RSpec Documentation Formatter writing to screen
11
+ - docs_screen
12
+ # Tick/Cross output to screen
13
+ - tick
14
+ # Tick/Cross output to file reports/<target>.tick
15
+ - tick_file
16
+ # JUnit Reports
17
+ - junit
18
+ # HTML Reports
19
+ - html
20
+ # Pretty HTML Reports
21
+ - html_pretty
22
+ # JSON Output
23
+ - json
24
+ # RSpec .F* progress bar
25
+ - progress
26
+ # Use colorized output (default: true)
27
+ color: false
28
+
29
+ # Load shared examples from third party gems, useful for sharing infrastucture tests across projects
30
+ shared_example_gems:
31
+ - my_shared_examples
32
+
33
+ # Specify environment variables used on the hosts when testing
34
+ # these are available as ENV['<var name>'] from the tests
35
+ environment:
36
+ SOMEVAR: some value
37
+
38
+ # Specify variable to be used in the tests
39
+ # these are available from the tests as property[:variables][:<variable name>]
40
+ variables:
41
+ my_var: some value
42
+
43
+
44
+ # Target Based Testing
45
+ # For each target specified here there will be a rake task defined which can be invoked via 'serverspec:<target name>'.
46
+ # Targets with multiple hosts will also have 'serverspec:<target name>:<hostname>' defined for each host.
47
+ # Running 'serverspec:<target name>' will execute against all hosts in the target
48
+ # Running the 'serverspec' rake task will invoke all targets and environments
49
+
50
+ targets:
51
+ # Running against a host via ssh
52
+ ssh-example:
53
+ backend: ssh
54
+ # specify host if left blank will use target name as hostname
55
+ hosts: raspberrypi
56
+ # uses specific user
57
+ user: pi
58
+ # run spec file spec/pi_spec.rb
59
+ spec_type: pi
60
+
61
+ # Running against multiple hosts via ssh
62
+ ssh-multi-host-example:
63
+ # Dont really need to specify ssh backend as it is the default but including for completeness
64
+ hosts:
65
+ - raspberrypi
66
+ - blueberrypi
67
+ # uses specific user
68
+ user: pi
69
+ # run spec file spec/pi_spec.rb
70
+ spec_type: pi
71
+ # Don't fail the run if the target fails (if blank uses the global value which defaults to true)
72
+ fail_on_err: true
73
+
74
+ # Run against local host
75
+ exec-example:
76
+ backend: exec
77
+ # Run spec file spec/localhost_spec.rb
78
+ spec_type: localhost
79
+ # Specify variable to be used in tests as property[:variables][:<variable name>]
80
+ variables:
81
+ # Specify a new variable
82
+ some_var: some value
83
+ # Override an existing vale
84
+ my_var: new value
85
+
86
+ # Run tests against a docker images
87
+ docker-image-example:
88
+ backend: docker
89
+ # Run against the mongo docker image from docker hub
90
+ docker_image: mongo
91
+ # Use shared behaviors loaded from spec/shared/.rb
92
+ roles:
93
+ - database::mongo
94
+
95
+ # Run tests against a running docker container
96
+ docker-container-examples:
97
+ backend: docker
98
+ # Run against container named jenkins
99
+ docker_container: jenkins
100
+ # Explicitly specify the role spec file spec/role_spec.rb which should be generated by 'serverspec_launcher init'
101
+ # This isn't really needed as role is the default spec_type
102
+ spec_type: role
103
+ roles:
104
+ # Run role with in context
105
+ - name: build_tools::jenkins
106
+ description: Jenkins Container
107
+
108
+ # Run tests against a docker build file
109
+ dockerfile-examples:
110
+ backend: docker
111
+ # Build image from Dockerfile in current directory
112
+ docker_build_dir: .
113
+ # Run spec file spec/docker_spec.rb
114
+ spec_type: docker
115
+
116
+
117
+ # Run tests against a vagrant file
118
+ vagrant-example:
119
+ backend: vagrant
120
+ roles:
121
+ - debug::environment_vars
122
+ environment:
123
+ # This environment var will only be availble to this target
124
+ MY_VAR: my value
125
+ # Override a globally set environment var
126
+ SOMEVAR: some other value
127
+
128
+ environments:
129
+ qa:
130
+ variables:
131
+ # Override global variable
132
+ my_var: enviroment value
133
+ some_thing: a value
134
+
135
+ targets:
136
+ webservers: &webservers
137
+ hosts:
138
+ - web1.qa.domain
139
+ - web2.qa.domain
140
+ variables:
141
+ # Override variable
142
+ some_thing: new value
143
+
144
+ performance:
145
+ targets:
146
+ webservers:
147
+ # Yaml anchors are supported
148
+ <<: *webservers
149
+ hosts:
150
+ - web1.perf.domain
151
+ - web2.perf.domain
152
+ - web3.perf.domain
153
+ - web4.perf.domain
154
+ variables:
155
+ # Override variable
156
+ some_thing: new value
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serverspec_launcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.12
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Wardrobe
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-08 00:00:00.000000000 Z
11
+ date: 2018-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: debase
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: serverspec
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +136,20 @@ dependencies:
108
136
  - - '='
109
137
  - !ruby/object:Gem::Version
110
138
  version: 0.1.3
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec_html_reporter
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 1.0.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 1.0.0
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: docker-api
113
155
  requirement: !ruby/object:Gem::Requirement