serverspec_launcher 0.1.12 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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