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 +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
|