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 +4 -4
- data/lib/serverspec_launcher/helpers/symbolize_helper.rb +5 -0
- data/lib/serverspec_launcher/rake_tasks.rb +42 -27
- data/lib/serverspec_launcher/spec_helper.rb +14 -5
- data/lib/serverspec_launcher/version.rb +1 -1
- data/serverspec_launcher.gemspec +3 -0
- data/templates/properties.yaml.erb +155 -28
- metadata +44 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c7f4e2ec421c549a1d9c00424757c4d14b671a53f7eec83b4628071f5554efd3
|
4
|
+
data.tar.gz: 903bd958354012b07b8896d3e82735a32900e08d450c875cc3ff3ea1070f3644
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
-
@
|
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
|
data/serverspec_launcher.gemspec
CHANGED
@@ -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
|
-
|
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
|
-
#
|
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.
|
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-
|
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
|