leeroy_app 0.4.0 → 0.5.4

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
  SHA1:
3
- metadata.gz: 723b884782e4c4e3d9693517be658ddae7e4327c
4
- data.tar.gz: 24e592e593bd399d5ec465ac26018877aee91414
3
+ metadata.gz: 81ff5e5b7517a53e944da48533b2a5a6e480f913
4
+ data.tar.gz: 19081c67c07880c9a62786d580386428ee2d47ac
5
5
  SHA512:
6
- metadata.gz: e074858bc80906c2f1ed5d3707603a6371a9b9687f967af192b73e34f3e4aa7ffddd784a79c4780db749618ea1a09a4c5379b8f008bab4e2dd8e3e16942ae154
7
- data.tar.gz: 8f6a28f2c37a83a722d171ec1eed9c7fcc647c347970a6e77d5f4ac0fb0d0dd94a8f3cfcdd42b559f0bc476889052279807314da695ac01455b112d26c1bf23a
6
+ metadata.gz: d534910010564925dcf5fbe93a40867dc567a2df0fee36ab7d9d5784a9a939865b2b94ba8ce5ee14fdeb58b3ddfdcc4b6ec9350e876d9964869e570a38a79fe1
7
+ data.tar.gz: 05b8a14ae29aad1d70056bd33e29146a0d783bfd4e6811901316f4e62e697e4612314a6c6b365228b7cb1347e01fefb9cff249eacc76dbf9451039525f7ec903
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.0.0-p645
1
+ 2.3.0
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ cache: bundler
3
+ rvm:
4
+ - 2.0.0-p648
5
+ - 2.1.8
6
+ - 2.3.0
data/Dockerfile ADDED
@@ -0,0 +1,17 @@
1
+ FROM ruby:2.3
2
+ MAINTAINER Tim Hartmann <tim.hartmann@runkeeper.com>
3
+
4
+ ENV ENVIRONMENT=docker
5
+ RUN apt-get update && \
6
+ apt-get install cmake unzip libgit2-21 -y
7
+ RUN mkdir -p /tmp/build && \
8
+ wget https://releases.hashicorp.com/packer/0.12.3/packer_0.12.3_linux_amd64.zip && \
9
+ unzip -d /bin packer_0.12.3_linux_amd64.zip
10
+ RUN mkdir -p /opt/leeroy
11
+ WORKDIR /opt/leeroy
12
+ COPY . /opt/leeroy
13
+ RUN bundle install --without=development --deployment
14
+ RUN leeroy env -d > .env
15
+ VOLUME /data
16
+ ENTRYPOINT ["leeroy"]
17
+ CMD ["help"]
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- leeroy_app (0.4.0)
4
+ leeroy_app (0.5.4)
5
5
  awesome_print (~> 1.6)
6
6
  aws-sdk (~> 2)
7
7
  chronic (~> 0.10)
@@ -9,6 +9,7 @@ PATH
9
9
  gli (~> 2.13)
10
10
  hashie (~> 3.4)
11
11
  multi_json (~> 1.11)
12
+ packer-client (~> 0.1.0)
12
13
  rugged (~> 0.23)
13
14
  smart_polling (~> 1.0)
14
15
  typesafe_enum (~> 0.1)
@@ -18,7 +19,7 @@ PATH
18
19
  GEM
19
20
  remote: https://rubygems.org/
20
21
  specs:
21
- aruba (0.11.1)
22
+ aruba (0.11.2)
22
23
  childprocess (~> 0.5.6)
23
24
  contracts (~> 0.9)
24
25
  cucumber (>= 1.3.19)
@@ -26,66 +27,75 @@ GEM
26
27
  ffi (~> 1.9.10)
27
28
  rspec-expectations (>= 2.99)
28
29
  thor (~> 0.19)
29
- awesome_print (1.6.1)
30
- aws-sdk (2.2.27)
31
- aws-sdk-resources (= 2.2.27)
32
- aws-sdk-core (2.2.27)
30
+ awesome_print (1.7.0)
31
+ aws-sdk (2.8.14)
32
+ aws-sdk-resources (= 2.8.14)
33
+ aws-sdk-core (2.8.14)
34
+ aws-sigv4 (~> 1.0)
33
35
  jmespath (~> 1.0)
34
- aws-sdk-resources (2.2.27)
35
- aws-sdk-core (= 2.2.27)
36
- builder (3.2.2)
36
+ aws-sdk-resources (2.8.14)
37
+ aws-sdk-core (= 2.8.14)
38
+ aws-sigv4 (1.0.0)
39
+ builder (3.2.3)
37
40
  childprocess (0.5.9)
38
41
  ffi (~> 1.0, >= 1.0.11)
39
42
  chronic (0.10.2)
40
- coderay (1.1.0)
41
- contracts (0.12.0)
42
- cucumber (2.1.0)
43
+ coderay (1.1.1)
44
+ contracts (0.15.0)
45
+ cucumber (2.4.0)
43
46
  builder (>= 2.1.2)
44
- cucumber-core (~> 1.3.0)
47
+ cucumber-core (~> 1.5.0)
48
+ cucumber-wire (~> 0.0.1)
45
49
  diff-lcs (>= 1.1.3)
46
- gherkin3 (~> 3.1.0)
50
+ gherkin (~> 4.0)
47
51
  multi_json (>= 1.7.5, < 2.0)
48
52
  multi_test (>= 0.1.2)
49
- cucumber-core (1.3.1)
50
- gherkin3 (~> 3.1.0)
51
- diff-lcs (1.2.5)
52
- dotenv (2.1.0)
53
+ cucumber-core (1.5.0)
54
+ gherkin (~> 4.0)
55
+ cucumber-wire (0.0.1)
56
+ diff-lcs (1.3)
57
+ dotenv (2.2.0)
53
58
  event-bus (0.2.3)
54
- ffi (1.9.10)
55
- gherkin3 (3.1.2)
56
- gli (2.13.4)
57
- hashie (3.4.3)
58
- jmespath (1.1.3)
59
+ ffi (1.9.18)
60
+ gherkin (4.1.1)
61
+ gli (2.16.0)
62
+ hashie (3.5.5)
63
+ jmespath (1.3.1)
59
64
  method_source (0.8.2)
60
- multi_json (1.11.2)
65
+ mixlib-shellout (2.2.7)
66
+ multi_json (1.12.1)
61
67
  multi_test (0.1.2)
62
- pry (0.10.3)
68
+ os (0.9.6)
69
+ packer-client (0.1.0)
70
+ mixlib-shellout (~> 2.2)
71
+ os (~> 0.9)
72
+ pry (0.10.4)
63
73
  coderay (~> 1.1.0)
64
74
  method_source (~> 0.8.1)
65
75
  slop (~> 3.4)
66
- pry-awesome_print (9.6.10)
76
+ pry-awesome_print (9.6.11)
67
77
  awesome_print (>= 1.1.0, < 999)
68
78
  pry (>= 0.9.0, < 999)
69
- rake (10.4.2)
70
- rspec (3.4.0)
71
- rspec-core (~> 3.4.0)
72
- rspec-expectations (~> 3.4.0)
73
- rspec-mocks (~> 3.4.0)
74
- rspec-core (3.4.1)
75
- rspec-support (~> 3.4.0)
76
- rspec-expectations (3.4.0)
79
+ rake (10.5.0)
80
+ rspec (3.5.0)
81
+ rspec-core (~> 3.5.0)
82
+ rspec-expectations (~> 3.5.0)
83
+ rspec-mocks (~> 3.5.0)
84
+ rspec-core (3.5.4)
85
+ rspec-support (~> 3.5.0)
86
+ rspec-expectations (3.5.0)
77
87
  diff-lcs (>= 1.2.0, < 2.0)
78
- rspec-support (~> 3.4.0)
79
- rspec-mocks (3.4.1)
88
+ rspec-support (~> 3.5.0)
89
+ rspec-mocks (3.5.0)
80
90
  diff-lcs (>= 1.2.0, < 2.0)
81
- rspec-support (~> 3.4.0)
82
- rspec-support (3.4.1)
83
- rugged (0.24.0)
91
+ rspec-support (~> 3.5.0)
92
+ rspec-support (3.5.0)
93
+ rugged (0.25.1.1)
84
94
  slop (3.6.0)
85
95
  smart_polling (1.0.0)
86
- thor (0.19.1)
87
- typesafe_enum (0.1.6)
88
- yell (2.0.5)
96
+ thor (0.19.4)
97
+ typesafe_enum (0.1.7)
98
+ yell (2.0.7)
89
99
  yell-adapters-syslog (2.0.2)
90
100
  yell (~> 2.0)
91
101
 
@@ -102,4 +112,4 @@ DEPENDENCIES
102
112
  rspec (~> 3.3)
103
113
 
104
114
  BUNDLED WITH
105
- 1.11.2
115
+ 1.14.6
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- # leeroy [![Gem Version](https://badge.fury.io/rb/leeroy_app.svg)](https://badge.fury.io/rb/leeroy_app) [![Code Climate](https://codeclimate.com/github/FitnessKeeper/leeroy/badges/gpa.svg)](https://codeclimate.com/github/FitnessKeeper/leeroy)
1
+ # leeroy [![Gem Version](https://badge.fury.io/rb/leeroy_app.svg)](https://badge.fury.io/rb/leeroy_app) [![Code Climate](https://codeclimate.com/github/FitnessKeeper/leeroy/badges/gpa.svg)](https://codeclimate.com/github/FitnessKeeper/leeroy) [![Build Status](https://travis-ci.org/FitnessKeeper/leeroy.svg?branch=master)](https://travis-ci.org/FitnessKeeper/leeroy) [![Docker Hub Automated Build](https://img.shields.io/docker/automated/fitnesskeeper/leeroy.svg)](https://hub.docker.com/r/fitnesskeeper/leeroy)
2
+
2
3
  o rly? ya rly!
3
4
 
4
5
  ## Installation/Configuration
@@ -6,6 +7,7 @@ o rly? ya rly!
6
7
  ### Development
7
8
 
8
9
  $ bundle install
10
+ $ export ENVIRONMENT=development
9
11
  $ ./bin/leeroy env -d > .env
10
12
  $ $EDITOR .env
11
13
 
@@ -33,6 +35,22 @@ Create a new application image:
33
35
 
34
36
  $ leeroy instantiate --phase application | leeroy image | leeroy terminate
35
37
 
38
+ ### Phases
39
+ A word about Phases in leeroy. A phase is a context in which you execute an action.
40
+
41
+ For example, setting the phase to gold_master sets the context such that we, and leeroy, know that we will be creating a new image - aka AMI, in which can then be used to deploy application against.
42
+
43
+ Currently accepted phases
44
+ ```Yaml
45
+ ---
46
+ - gold_master
47
+ - application
48
+ ```
49
+
50
+ ### Packer
51
+
52
+ Leeroy will look for packer templates named main.json in locations built off LEEROY_PACKER_TEMPLATE_PREFIX + LEEROY_APP_NAME, so for example if `LEEROY_PACKER_TEMPLATE_PREFIX=/home/user/packer-repo` and `LEEROY_APP_NAME=rk-bastion` leeroy will look for main.json in `/home/user/packer-repo/rk-bastion/main.json` leeroy will also attempt to pass packer the PHASE for use by any provisioners as a packer var, e.g -var phase=gold_master will get passed to packer, and can be used by puppet or whatever to configure the image appropriately
53
+
36
54
  ### Provisioning workflow
37
55
 
38
56
  FIXME not implemented yet
data/Rakefile CHANGED
@@ -3,3 +3,4 @@ require "bundler/gem_tasks"
3
3
  require "rspec/core/rake_task"
4
4
 
5
5
  RSpec::Core::RakeTask.new(:spec)
6
+ task :default => [:spec]
data/leeroy.gemspec CHANGED
@@ -6,8 +6,8 @@ require 'leeroy/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "leeroy_app"
8
8
  spec.version = Leeroy::VERSION
9
- spec.authors = ["Steve Huff"]
10
- spec.email = ["steve.huff@runkeeper.com"]
9
+ spec.authors = ["Steve Huff", "Tim Hartmann"]
10
+ spec.email = ["steve.huff@runkeeper.com", "tim.hartmann@runkeeper.com"]
11
11
  spec.summary = %q{Automate tasks with Jenkins}
12
12
  spec.description = %q{Leeroy is a framework and CLI app that captures common features required at various points in a CI pipeline. It is designed to be invoked interactively or from Jenkins scripts.}
13
13
  spec.homepage = "https://github.com/FitnessKeeper/leeroy"
@@ -40,4 +40,5 @@ Gem::Specification.new do |spec|
40
40
  spec.add_runtime_dependency "typesafe_enum", "~> 0.1"
41
41
  spec.add_runtime_dependency "yell", "~> 2.0"
42
42
  spec.add_runtime_dependency "yell-adapters-syslog", "~> 2.0"
43
+ spec.add_runtime_dependency "packer-client", "~> 0.1.0"
43
44
  end
data/lib/leeroy/app.rb CHANGED
@@ -8,6 +8,7 @@ require 'leeroy/task/image'
8
8
  require 'leeroy/task/instantiate'
9
9
  require 'leeroy/task/terminate'
10
10
  require 'leeroy/task/sleep'
11
+ require 'leeroy/task/packer'
11
12
  require 'leeroy/task/stub'
12
13
  require 'leeroy/types/fixture'
13
14
  require 'leeroy/types/phase'
@@ -21,7 +22,7 @@ module Leeroy
21
22
  VALID_PHASE = Leeroy::Types::Phase.to_a.collect {|x| x.value}
22
23
  VALID_FIXTURE = Leeroy::Types::Fixture.to_a.collect {|x| x.value}
23
24
 
24
- program_desc 'Automate tasks with Jenkins'
25
+ program_desc 'Automate tasks with Jenkins. When passing arguments, order is, CLI argument, then ENV[LEEROY_VAR]'
25
26
 
26
27
  # global options
27
28
  desc "Perform the requested task (pass '--no-op' for testing)."
@@ -114,6 +115,31 @@ module Leeroy
114
115
  task.perform
115
116
  end
116
117
  end
118
+ ##
119
+ desc "Creates an image from a Packer template."
120
+ command :packer do |c|
121
+
122
+ valid_phase = VALID_PHASE
123
+ c.desc "Phase of deploy process for which to deploy (must be one of #{valid_phase.sort})."
124
+ c.flag [:p, :phase]
125
+
126
+ c.desc "Source AMI sourced from CLI argument, then ENV[LEEROY_AWS_LINUX_AMI], and state"
127
+ c.flag [:i, :imageid]
128
+
129
+ c.desc "Name App / template directory to build from, e.g LEEROY_APP_NAME=rk-bastion builds from template \"repo/rk-bastion/main.json\""
130
+ c.flag [:n, :name]
131
+
132
+ c.action do |global_options,options,args|
133
+ # validate input
134
+ unless options[:phase].nil? or valid_phase.include?(options[:phase])
135
+ help_now! "Valid arguments for '--phase' are: #{valid_phase.join(',')}."
136
+ end
137
+
138
+ task = Leeroy::Task::Packer.new(global_options: global_options, options: options, args: args)
139
+ task.perform
140
+ end
141
+ end
142
+ ##
117
143
 
118
144
  desc "Creates a fixture for a staging environment."
119
145
  command :fixture do |c|
data/lib/leeroy/env.rb CHANGED
@@ -41,6 +41,7 @@ module Leeroy
41
41
  'LEEROY_PROVISIONING_TEMPLATE_PREFIX' => '<path on local filesystem to directory containing provisioning templates>',
42
42
  'LEEROY_S3_BUCKET' => '<name of bucket used as datastore>',
43
43
  'LEEROY_USER_DATA_PREFIX' => '<path on local filesystem to directory containing user-data scripts>',
44
+ 'LEEROY_PACKER_TEMPLATE_PREFIX' => '<path on local filesystem to directory containing packer templates. e.g. /home/user/packer-repo',
44
45
  }
45
46
 
46
47
  ENV_EXTRAS = {
@@ -19,6 +19,9 @@ module Leeroy
19
19
  # Yell.new :stderr, name: self.class.to_s, format: TRACE_FORMAT, trace: TRACE_LEVELS, level: :debug
20
20
  if ENV['ENVIRONMENT'] == 'production'
21
21
  Yell.new :syslog, name: self.class.to_s, format: TRACE_FORMAT, trace: TRACE_LEVELS, level: :info, facility: :user
22
+ elsif ENV['ENVIRONMENT'] == 'docker'
23
+ # Do nothing
24
+ Yell.new :file, '/tmp/leeroy.log', name: self.class.to_s, format: TRACE_FORMAT, trace: TRACE_LEVELS, level: :info, facility: :user
22
25
  else
23
26
  Yell.new :stderr, name: self.class.to_s, format: TRACE_FORMAT, trace: TRACE_LEVELS, level: :debug
24
27
  end
@@ -0,0 +1,103 @@
1
+ require 'aws-sdk'
2
+ require 'packer'
3
+
4
+ require 'leeroy/helpers'
5
+ require 'leeroy/helpers/env'
6
+
7
+ module Leeroy
8
+ module Helpers
9
+ module Packer
10
+ include Leeroy::Helpers
11
+
12
+ attr :packer_client
13
+
14
+ # This lets us mix in the packer helper methods when we initialize
15
+ # Leeroy::Task::Packer
16
+ def initialize(*args, &block)
17
+ super(*args, &block)
18
+
19
+ logger.debug "initializing Packer helpers"
20
+
21
+ @packer_client = ::Packer::Client.new
22
+
23
+ logger.debug "Packer helpers initialized"
24
+ end
25
+
26
+ # cwd in the below code inticates the command working directory
27
+ # which is used to change dir's into the directory where main.json is
28
+ # so that relitive paths used in the packer template expand correctly
29
+ def validatePacker(cwd, vars = {})
30
+ begin
31
+ packer_ver = self.packer_client.version.version
32
+ logger.debug "Loading Packer using version :'#{packer_ver}'"
33
+
34
+ template = File.join(cwd, "main.json")
35
+ logger.debug "Loading Packer Template :'#{template}'"
36
+
37
+ logger.debug "Validating Packer Template syntax :'#{template}'"
38
+
39
+ validate( cwd, template, {:syntax_only => true })
40
+ validate( cwd, template , vars )
41
+
42
+ rescue RuntimeError => e
43
+ logger.debug "Packer Template '#{template}' failed with message: #{e.message}"
44
+ raise e
45
+ rescue StandardError => e
46
+ raise e
47
+ end
48
+ end
49
+
50
+ # Validate templates - cwd changes working directory
51
+ def validate(cwd, *args)
52
+ begin
53
+ Dir.chdir(cwd) do
54
+ validated = self.packer_client.validate(*args)
55
+
56
+ if validated.valid?
57
+ validated
58
+ else
59
+ raise RuntimeError.new(validated.stdout)
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+
66
+ # Build - cwd changes working directory
67
+ def buildPacker(cwd, vars = {})
68
+ begin
69
+ packer_ver = self.packer_client.version.version
70
+ logger.debug "Building Packer using version :'#{packer_ver}'"
71
+
72
+ template = File.join(cwd, "main.json")
73
+ logger.debug "Loading Packer Template :'#{template}'"
74
+
75
+ logger.debug "Building Packer Template :'#{template}'"
76
+
77
+ build(cwd, template, vars)
78
+
79
+ rescue RuntimeError => e
80
+ logger.debug "Packer Build '#{template}' failed with message: #{e.message}"
81
+ raise e
82
+ rescue StandardError => e
83
+ raise e
84
+ end
85
+ end
86
+
87
+ def build(cwd, *args)
88
+ begin
89
+ Dir.chdir(cwd) do
90
+ output =self.packer_client.build(*args)
91
+
92
+ if output.errors.any?
93
+ raise RuntimeError.new(output.errors)
94
+ else
95
+ output
96
+ end
97
+ end
98
+ end
99
+ end
100
+ ###
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,108 @@
1
+ require 'leeroy'
2
+ require 'leeroy/task'
3
+ require 'leeroy/helpers/aws'
4
+ require 'leeroy/helpers/packer'
5
+ require 'leeroy/types/packer'
6
+
7
+ # input
8
+ # pass in path to packer template - ex rk-bastion/main.json
9
+ # AWS_DEFAULT_REGION=us-east-1
10
+ # LEEROY_AWS_LINUX_AMI=ami-b73b63a0
11
+ # LEEROY_APP_NAME=rk-bastion
12
+ # LEEROY_PACKER_TEMPLATE_PREFIX=/data/packer-rk-apps
13
+ # Output region and AMI
14
+
15
+ module Leeroy
16
+ module Task
17
+ class Packer < Leeroy::Task::Base
18
+ include Leeroy::Helpers::AWS
19
+ include Leeroy::Helpers::Packer
20
+
21
+ def perform(args = self.args, options = self.options, global_options = self.global_options)
22
+ begin
23
+ super(args, options, global_options)
24
+
25
+ phase = Leeroy::Types::Phase.resolve(self.state.fetch('phase'), options[:phase])
26
+ logger.debug "phase: #{phase}"
27
+ # update phase in state
28
+ self.state.phase = phase
29
+
30
+ packer_params = _getPackerParams
31
+ packer_vars = Leeroy::Types::Packer.new(packer_params)
32
+
33
+ # Sending app_name to state
34
+ self.state.app_name = packer_vars.app_name
35
+
36
+ # cwd is the fille filename where the packer template lives
37
+ cwd = File.join(packer_vars.packer_template_prefix, self.state.app_name)
38
+
39
+ validation = validatePacker(cwd, { :vars => packer_vars })
40
+
41
+ build = buildPacker(cwd,{ :vars => packer_vars } )
42
+ build.artifacts.each do | item |
43
+ self.state.message = item.string
44
+ artifact = item.id.split(':')
45
+ self.state.imageid = artifact[1]
46
+ end
47
+
48
+ logger.debug "#{build.stdout}"
49
+ logger.debug "Packer Artifact Created : #{state.imageid}"
50
+
51
+ dump_state
52
+
53
+ logger.debug "done performing for #{self.class}"
54
+
55
+ rescue StandardError => e
56
+ logger.debug e.message
57
+ raise e
58
+ end
59
+ end
60
+ private
61
+ def _getPackerParams(state = self.state, env = self.env, options = self.options)
62
+ begin
63
+ logger.debug "generating Packer params to create an AMI"
64
+ packer_params = Leeroy::Types::Mash.new
65
+
66
+ if self.state.imageid?
67
+ imageid = self.state.imageid
68
+ elsif options[:imageid].nil?
69
+ imageid = checkEnv('LEEROY_AWS_LINUX_AMI')
70
+ else
71
+ imageid = options[:imageid]
72
+ end
73
+ packer_params.aws_linux_ami = imageid
74
+
75
+ if self.state.app_name?
76
+ app_name = self.state.app_name
77
+ elsif options[:name].nil?
78
+ app_name = checkEnv('LEEROY_APP_NAME')
79
+ else
80
+ app_name = options[:name]
81
+ end
82
+ packer_params.app_name = app_name
83
+
84
+ if self.state.aws_region?
85
+ aws_region = self.state.aws_region
86
+ else
87
+ aws_region = ENV['AWS_DEFAULT_REGION'] || ENV['AWS_REGION']
88
+ end
89
+ packer_params.aws_region = aws_region
90
+
91
+ # LEEROY_PACKER_TEMPLATE_PREFIX
92
+ if self.state.packer_template_prefix?
93
+ packer_template_prefix = self.state.packer_template_prefix
94
+ elsif options[:packer_template_prefix].nil?
95
+ packer_template_prefix = checkEnv('LEEROY_PACKER_TEMPLATE_PREFIX')
96
+ else
97
+ packer_template_prefix = options[:packer_template_prefix]
98
+ end
99
+ packer_params.packer_template_prefix = packer_template_prefix
100
+
101
+ packer_params
102
+ rescue StandardError => e
103
+ raise e
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,33 @@
1
+ require 'leeroy'
2
+ require 'leeroy/types/dash'
3
+ require 'leeroy/types/phase'
4
+ require 'leeroy/helpers/dumpable'
5
+ require 'leeroy/helpers/logging'
6
+
7
+ module Leeroy
8
+ module Types
9
+ class Packer < Leeroy::Types::Dash
10
+ include Leeroy::Helpers::Dumpable
11
+ include Leeroy::Helpers::Logging
12
+
13
+ property :app_name, coerce: String
14
+ property :aws_linux_ami, coerce: String
15
+ property :aws_region, coerce: String
16
+ property :packer_vars
17
+ property :packer_template_prefix
18
+
19
+ def initialize(*args, &block)
20
+ self.packer_vars = [
21
+ :aws_linux_ami,
22
+ :app_name,
23
+ :aws_region,
24
+ :packer_template_prefix
25
+ ]
26
+
27
+ self.dump_properties = self.packer_vars
28
+
29
+ super
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,3 +1,3 @@
1
1
  module Leeroy
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.4"
3
3
  end
data/spec/app_spec.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'rspec'
2
+
3
+ RSpec.describe "test spec for app.rb" do
4
+ before do
5
+ end
6
+
7
+ after do
8
+ end
9
+
10
+ it "works" do
11
+ expect(true).to eq(true)
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+ require 'leeroy'
3
+ require 'leeroy/task/fixture'
4
+ require 'leeroy/task/image'
5
+ require 'leeroy/task/instantiate'
6
+ require 'leeroy/task/terminate'
7
+ require 'leeroy/task/sleep'
8
+ require 'leeroy/task/stub'
9
+ require 'leeroy/types/fixture'
10
+ require 'leeroy/types/phase'
11
+
12
+ ENV["AWS_REGION"] = "us-east-1"
13
+ describe "Test Leeroy::Env New" do
14
+ before(:each) do
15
+ @env = Leeroy::Env.new
16
+ end
17
+ it "get instance of Leeroy::Env" do
18
+ expect(@env).to be_instance_of(Leeroy::Env)
19
+ end
20
+ end
21
+
22
+ describe "Test Leeroy::Task::Fixture New" do
23
+ before(:each) do
24
+ @fixture = Leeroy::Task::Fixture.new
25
+ end
26
+ it "get instance of Leeroy::Task::Fixture" do
27
+ expect(@fixture).to be_instance_of(Leeroy::Task::Fixture)
28
+ end
29
+ end
30
+
31
+
32
+ #image
33
+ #instantiate
34
+ #sleep
35
+ #stub
36
+ #terminate
37
+ #version
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'aws-sdk'
1
2
  # This file was generated by the `rspec --init` command. Conventionally, all
2
3
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
4
  # The generated `.rspec` file contains `--require spec_helper` which will cause
@@ -17,6 +18,7 @@
17
18
  #
18
19
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
19
20
  RSpec.configure do |config|
21
+ Aws.config.update(stub_responses: true)
20
22
  # rspec-expectations config goes here. You can use an alternate
21
23
  # assertion/expectation library such as wrong or the stdlib/minitest
22
24
  # assertions if you prefer.
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+ require 'leeroy'
3
+ require 'leeroy/env'
4
+ require 'leeroy/helpers'
5
+ require 'leeroy/helpers/env'
6
+ require 'leeroy/helpers/logging'
7
+ require 'leeroy/helpers/state'
8
+ require 'leeroy/state'
9
+ require 'leeroy/task'
10
+ require 'leeroy/types/mash'
11
+
12
+ describe "Test Leeroy::Task::Base New" do
13
+ before(:each) do
14
+ @base = Leeroy::Task::Base.new
15
+ end
16
+ it "get instance of Leeroy::Task::Base" do
17
+ expect(@base).to be_instance_of(Leeroy::Task::Base)
18
+ end
19
+ it "Check .global_options is an empty hash" do
20
+ expect(@base.global_options).to eq({})
21
+ end
22
+ it "Check .args is an empty hash" do
23
+ expect(@base.args).to eq({})
24
+ end
25
+ it "Check .state is initialized" do
26
+ expect(@base.state).to include(:data, :metadata )
27
+ expect(@base.state.metadata).to include(:task, :previous, :started )
28
+ expect(@base.state.metadata.task).to eq("Leeroy::Task::Base")
29
+ end
30
+ it "responds to .global_options" do
31
+ expect(@base).to respond_to(:global_options)
32
+ end
33
+ it "responds to .args" do
34
+ expect(@base).to respond_to(:args)
35
+ end
36
+ it "responds to .state" do
37
+ expect(@base).to respond_to(:state)
38
+ end
39
+ end
40
+
41
+ describe "Test Leeroy::Task::Base New with global_options" do
42
+ before(:each) do
43
+ @base = Leeroy::Task::Base.new(:global_options => {:foo => "bar"})
44
+ end
45
+ it "get instance of Leeroy::Task::Base" do
46
+ expect(@base).to be_instance_of(Leeroy::Task::Base)
47
+ end
48
+ it "Check .global_options has the content we want" do
49
+ expect(@base.global_options).to eq({:foo => "bar"})
50
+ expect(@base.global_options.fetch(:foo)).to eq("bar")
51
+ end
52
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+ require 'leeroy'
3
+ require 'leeroy/task'
4
+ require 'leeroy/task/packer'
5
+ require 'leeroy/helpers/aws'
6
+ require 'leeroy/helpers/inventory'
7
+
8
+ describe "Test Leeroy::Task::Packer New" do
9
+ before(:each) do
10
+ @packer = Leeroy::Task::Packer.new
11
+ end
12
+ it "get instance of Leeroy::Task::Packer" do
13
+ expect(@packer).to be_instance_of(Leeroy::Task::Packer)
14
+ end
15
+ # Test that perform validates packer template syntax
16
+
17
+ end
@@ -0,0 +1,38 @@
1
+ require 'leeroy/task'
2
+
3
+
4
+ describe "Test Leeroy::Task::Stub New" do
5
+ before(:each) do
6
+ @stub = Leeroy::Task::Stub.new
7
+ end
8
+ it "get instance of Leeroy::Task::Stub" do
9
+ expect(@stub).to be_instance_of(Leeroy::Task::Stub)
10
+ end
11
+
12
+ #stub.state.data
13
+ it "responds to .perform" do
14
+ expect(@stub).to respond_to(:perform)
15
+ end
16
+
17
+ it "Check that perform added a message to the .state.data hash" do
18
+ @stub.perform
19
+ expect(@stub.state.data).to include(:message)
20
+ expect(@stub.state.data.message).to eq('0')
21
+ @stub.perform
22
+ expect(@stub.state.data.message).should_not eq('1')
23
+ end
24
+ end
25
+
26
+
27
+ describe 'Test Leeroy::Task::Stub New { :increment => "1"}' do
28
+ before(:each) do
29
+ @stub = Leeroy::Task::Stub.new(:options => { :increment => "1"})
30
+ end
31
+ it "Check :message can be incremented by 1" do
32
+ @stub.perform
33
+ expect(@stub.state.data).to include(:message)
34
+ expect(@stub.state.data.message).to eq('1')
35
+ @stub.perform
36
+ expect(@stub.state.data.message).to eq('2')
37
+ end
38
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+ require 'leeroy'
3
+ require 'leeroy/task'
4
+ require 'leeroy/task/packer'
5
+ require 'leeroy/helpers/aws'
6
+ require 'leeroy/helpers/inventory'
7
+
8
+ describe "Test Leeroy::Types::Packer New" do
9
+ before(:each) do
10
+ @packer = Leeroy::Types::Packer.new
11
+ end
12
+ it "get instance of Leeroy::Types::Packer" do
13
+ expect(@packer).to be_instance_of(Leeroy::Types::Packer)
14
+ end
15
+ # Test that perform validates packer template syntax
16
+
17
+ it "Check that ::Types::Packer initialized correctly" do
18
+ expect(@packer.packer_vars).to include(:aws_linux_ami, :app_name, :aws_region, :packer_template_prefix)
19
+ end
20
+ #{"packer_vars"=>[:aws_linux_ami, :app_name, :aws_region]}
21
+ end
@@ -1,11 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe 'version', :type => :aruba do
4
- @announce
5
- let(:file) { 'file.txt' }
6
- let(:content) { 'Hello World' }
4
+ skip "is boilerplate" do
5
+ @announce
6
+ let(:file) { 'file.txt' }
7
+ let(:content) { 'Hello World' }
7
8
 
8
- before(:each) { write_file file, content }
9
+ before(:each) { write_file file, content }
9
10
 
10
- it { expect(read(file)).to eq [content] }
11
+ it { expect(read(file)).to eq [content] }
12
+ end
11
13
  end
metadata CHANGED
@@ -1,284 +1,302 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leeroy_app
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steve Huff
8
+ - Tim Hartmann
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-03-30 00:00:00.000000000 Z
12
+ date: 2017-03-30 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: aruba
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
- - - ~>
18
+ - - "~>"
18
19
  - !ruby/object:Gem::Version
19
20
  version: 0.11.1
20
21
  type: :development
21
22
  prerelease: false
22
23
  version_requirements: !ruby/object:Gem::Requirement
23
24
  requirements:
24
- - - ~>
25
+ - - "~>"
25
26
  - !ruby/object:Gem::Version
26
27
  version: 0.11.1
27
28
  - !ruby/object:Gem::Dependency
28
29
  name: bundler
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
- - - ~>
32
+ - - "~>"
32
33
  - !ruby/object:Gem::Version
33
34
  version: '1.6'
34
35
  type: :development
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
- - - ~>
39
+ - - "~>"
39
40
  - !ruby/object:Gem::Version
40
41
  version: '1.6'
41
42
  - !ruby/object:Gem::Dependency
42
43
  name: rake
43
44
  requirement: !ruby/object:Gem::Requirement
44
45
  requirements:
45
- - - ~>
46
+ - - "~>"
46
47
  - !ruby/object:Gem::Version
47
48
  version: '10.0'
48
49
  type: :development
49
50
  prerelease: false
50
51
  version_requirements: !ruby/object:Gem::Requirement
51
52
  requirements:
52
- - - ~>
53
+ - - "~>"
53
54
  - !ruby/object:Gem::Version
54
55
  version: '10.0'
55
56
  - !ruby/object:Gem::Dependency
56
57
  name: rspec
57
58
  requirement: !ruby/object:Gem::Requirement
58
59
  requirements:
59
- - - ~>
60
+ - - "~>"
60
61
  - !ruby/object:Gem::Version
61
62
  version: '3.3'
62
63
  type: :development
63
64
  prerelease: false
64
65
  version_requirements: !ruby/object:Gem::Requirement
65
66
  requirements:
66
- - - ~>
67
+ - - "~>"
67
68
  - !ruby/object:Gem::Version
68
69
  version: '3.3'
69
70
  - !ruby/object:Gem::Dependency
70
71
  name: pry
71
72
  requirement: !ruby/object:Gem::Requirement
72
73
  requirements:
73
- - - ~>
74
+ - - "~>"
74
75
  - !ruby/object:Gem::Version
75
76
  version: '0.10'
76
77
  type: :development
77
78
  prerelease: false
78
79
  version_requirements: !ruby/object:Gem::Requirement
79
80
  requirements:
80
- - - ~>
81
+ - - "~>"
81
82
  - !ruby/object:Gem::Version
82
83
  version: '0.10'
83
84
  - !ruby/object:Gem::Dependency
84
85
  name: pry-awesome_print
85
86
  requirement: !ruby/object:Gem::Requirement
86
87
  requirements:
87
- - - ~>
88
+ - - "~>"
88
89
  - !ruby/object:Gem::Version
89
90
  version: '9.6'
90
91
  type: :development
91
92
  prerelease: false
92
93
  version_requirements: !ruby/object:Gem::Requirement
93
94
  requirements:
94
- - - ~>
95
+ - - "~>"
95
96
  - !ruby/object:Gem::Version
96
97
  version: '9.6'
97
98
  - !ruby/object:Gem::Dependency
98
99
  name: awesome_print
99
100
  requirement: !ruby/object:Gem::Requirement
100
101
  requirements:
101
- - - ~>
102
+ - - "~>"
102
103
  - !ruby/object:Gem::Version
103
104
  version: '1.6'
104
105
  type: :runtime
105
106
  prerelease: false
106
107
  version_requirements: !ruby/object:Gem::Requirement
107
108
  requirements:
108
- - - ~>
109
+ - - "~>"
109
110
  - !ruby/object:Gem::Version
110
111
  version: '1.6'
111
112
  - !ruby/object:Gem::Dependency
112
113
  name: aws-sdk
113
114
  requirement: !ruby/object:Gem::Requirement
114
115
  requirements:
115
- - - ~>
116
+ - - "~>"
116
117
  - !ruby/object:Gem::Version
117
118
  version: '2'
118
119
  type: :runtime
119
120
  prerelease: false
120
121
  version_requirements: !ruby/object:Gem::Requirement
121
122
  requirements:
122
- - - ~>
123
+ - - "~>"
123
124
  - !ruby/object:Gem::Version
124
125
  version: '2'
125
126
  - !ruby/object:Gem::Dependency
126
127
  name: chronic
127
128
  requirement: !ruby/object:Gem::Requirement
128
129
  requirements:
129
- - - ~>
130
+ - - "~>"
130
131
  - !ruby/object:Gem::Version
131
132
  version: '0.10'
132
133
  type: :runtime
133
134
  prerelease: false
134
135
  version_requirements: !ruby/object:Gem::Requirement
135
136
  requirements:
136
- - - ~>
137
+ - - "~>"
137
138
  - !ruby/object:Gem::Version
138
139
  version: '0.10'
139
140
  - !ruby/object:Gem::Dependency
140
141
  name: dotenv
141
142
  requirement: !ruby/object:Gem::Requirement
142
143
  requirements:
143
- - - ~>
144
+ - - "~>"
144
145
  - !ruby/object:Gem::Version
145
146
  version: '2.1'
146
147
  type: :runtime
147
148
  prerelease: false
148
149
  version_requirements: !ruby/object:Gem::Requirement
149
150
  requirements:
150
- - - ~>
151
+ - - "~>"
151
152
  - !ruby/object:Gem::Version
152
153
  version: '2.1'
153
154
  - !ruby/object:Gem::Dependency
154
155
  name: gli
155
156
  requirement: !ruby/object:Gem::Requirement
156
157
  requirements:
157
- - - ~>
158
+ - - "~>"
158
159
  - !ruby/object:Gem::Version
159
160
  version: '2.13'
160
161
  type: :runtime
161
162
  prerelease: false
162
163
  version_requirements: !ruby/object:Gem::Requirement
163
164
  requirements:
164
- - - ~>
165
+ - - "~>"
165
166
  - !ruby/object:Gem::Version
166
167
  version: '2.13'
167
168
  - !ruby/object:Gem::Dependency
168
169
  name: hashie
169
170
  requirement: !ruby/object:Gem::Requirement
170
171
  requirements:
171
- - - ~>
172
+ - - "~>"
172
173
  - !ruby/object:Gem::Version
173
174
  version: '3.4'
174
175
  type: :runtime
175
176
  prerelease: false
176
177
  version_requirements: !ruby/object:Gem::Requirement
177
178
  requirements:
178
- - - ~>
179
+ - - "~>"
179
180
  - !ruby/object:Gem::Version
180
181
  version: '3.4'
181
182
  - !ruby/object:Gem::Dependency
182
183
  name: multi_json
183
184
  requirement: !ruby/object:Gem::Requirement
184
185
  requirements:
185
- - - ~>
186
+ - - "~>"
186
187
  - !ruby/object:Gem::Version
187
188
  version: '1.11'
188
189
  type: :runtime
189
190
  prerelease: false
190
191
  version_requirements: !ruby/object:Gem::Requirement
191
192
  requirements:
192
- - - ~>
193
+ - - "~>"
193
194
  - !ruby/object:Gem::Version
194
195
  version: '1.11'
195
196
  - !ruby/object:Gem::Dependency
196
197
  name: rugged
197
198
  requirement: !ruby/object:Gem::Requirement
198
199
  requirements:
199
- - - ~>
200
+ - - "~>"
200
201
  - !ruby/object:Gem::Version
201
202
  version: '0.23'
202
203
  type: :runtime
203
204
  prerelease: false
204
205
  version_requirements: !ruby/object:Gem::Requirement
205
206
  requirements:
206
- - - ~>
207
+ - - "~>"
207
208
  - !ruby/object:Gem::Version
208
209
  version: '0.23'
209
210
  - !ruby/object:Gem::Dependency
210
211
  name: smart_polling
211
212
  requirement: !ruby/object:Gem::Requirement
212
213
  requirements:
213
- - - ~>
214
+ - - "~>"
214
215
  - !ruby/object:Gem::Version
215
216
  version: '1.0'
216
217
  type: :runtime
217
218
  prerelease: false
218
219
  version_requirements: !ruby/object:Gem::Requirement
219
220
  requirements:
220
- - - ~>
221
+ - - "~>"
221
222
  - !ruby/object:Gem::Version
222
223
  version: '1.0'
223
224
  - !ruby/object:Gem::Dependency
224
225
  name: typesafe_enum
225
226
  requirement: !ruby/object:Gem::Requirement
226
227
  requirements:
227
- - - ~>
228
+ - - "~>"
228
229
  - !ruby/object:Gem::Version
229
230
  version: '0.1'
230
231
  type: :runtime
231
232
  prerelease: false
232
233
  version_requirements: !ruby/object:Gem::Requirement
233
234
  requirements:
234
- - - ~>
235
+ - - "~>"
235
236
  - !ruby/object:Gem::Version
236
237
  version: '0.1'
237
238
  - !ruby/object:Gem::Dependency
238
239
  name: yell
239
240
  requirement: !ruby/object:Gem::Requirement
240
241
  requirements:
241
- - - ~>
242
+ - - "~>"
242
243
  - !ruby/object:Gem::Version
243
244
  version: '2.0'
244
245
  type: :runtime
245
246
  prerelease: false
246
247
  version_requirements: !ruby/object:Gem::Requirement
247
248
  requirements:
248
- - - ~>
249
+ - - "~>"
249
250
  - !ruby/object:Gem::Version
250
251
  version: '2.0'
251
252
  - !ruby/object:Gem::Dependency
252
253
  name: yell-adapters-syslog
253
254
  requirement: !ruby/object:Gem::Requirement
254
255
  requirements:
255
- - - ~>
256
+ - - "~>"
256
257
  - !ruby/object:Gem::Version
257
258
  version: '2.0'
258
259
  type: :runtime
259
260
  prerelease: false
260
261
  version_requirements: !ruby/object:Gem::Requirement
261
262
  requirements:
262
- - - ~>
263
+ - - "~>"
263
264
  - !ruby/object:Gem::Version
264
265
  version: '2.0'
266
+ - !ruby/object:Gem::Dependency
267
+ name: packer-client
268
+ requirement: !ruby/object:Gem::Requirement
269
+ requirements:
270
+ - - "~>"
271
+ - !ruby/object:Gem::Version
272
+ version: 0.1.0
273
+ type: :runtime
274
+ prerelease: false
275
+ version_requirements: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - "~>"
278
+ - !ruby/object:Gem::Version
279
+ version: 0.1.0
265
280
  description: Leeroy is a framework and CLI app that captures common features required
266
281
  at various points in a CI pipeline. It is designed to be invoked interactively
267
282
  or from Jenkins scripts.
268
283
  email:
269
284
  - steve.huff@runkeeper.com
285
+ - tim.hartmann@runkeeper.com
270
286
  executables:
271
287
  - leeroy
272
288
  extensions: []
273
289
  extra_rdoc_files: []
274
290
  files:
275
- - .codeclimate.yml
276
- - .gitignore
277
- - .rdoc_options
278
- - .rspec
279
- - .rubocop.yml
280
- - .ruby-version
281
- - .yardopts
291
+ - ".codeclimate.yml"
292
+ - ".gitignore"
293
+ - ".rdoc_options"
294
+ - ".rspec"
295
+ - ".rubocop.yml"
296
+ - ".ruby-version"
297
+ - ".travis.yml"
298
+ - ".yardopts"
299
+ - Dockerfile
282
300
  - Gemfile
283
301
  - Gemfile.lock
284
302
  - LICENSE
@@ -296,6 +314,7 @@ files:
296
314
  - lib/leeroy/helpers/env.rb
297
315
  - lib/leeroy/helpers/inventory.rb
298
316
  - lib/leeroy/helpers/logging.rb
317
+ - lib/leeroy/helpers/packer.rb
299
318
  - lib/leeroy/helpers/polling.rb
300
319
  - lib/leeroy/helpers/state.rb
301
320
  - lib/leeroy/helpers/template.rb
@@ -305,6 +324,7 @@ files:
305
324
  - lib/leeroy/task/fixture.rb
306
325
  - lib/leeroy/task/image.rb
307
326
  - lib/leeroy/task/instantiate.rb
327
+ - lib/leeroy/task/packer.rb
308
328
  - lib/leeroy/task/sleep.rb
309
329
  - lib/leeroy/task/stub.rb
310
330
  - lib/leeroy/task/terminate.rb
@@ -315,14 +335,21 @@ files:
315
335
  - lib/leeroy/types/instance.rb
316
336
  - lib/leeroy/types/mash.rb
317
337
  - lib/leeroy/types/packedstring.rb
338
+ - lib/leeroy/types/packer.rb
318
339
  - lib/leeroy/types/phase.rb
319
340
  - lib/leeroy/types/semaphore.rb
320
341
  - lib/leeroy/types/statedata.rb
321
342
  - lib/leeroy/types/statemetadata.rb
322
343
  - lib/leeroy/types/userdata.rb
323
344
  - lib/leeroy/version.rb
345
+ - spec/app_spec.rb
346
+ - spec/leeroy_spec.rb
324
347
  - spec/spec_helper.rb
325
348
  - spec/support/aruba.rb
349
+ - spec/task/base_spec.rb
350
+ - spec/task/packer_spec.rb
351
+ - spec/task/stub_spec.rb
352
+ - spec/types/packer_spec.rb
326
353
  - spec/use_aruba_with_rspec_spec.rb
327
354
  homepage: https://github.com/FitnessKeeper/leeroy
328
355
  licenses:
@@ -334,23 +361,29 @@ require_paths:
334
361
  - lib
335
362
  required_ruby_version: !ruby/object:Gem::Requirement
336
363
  requirements:
337
- - - '>='
364
+ - - ">="
338
365
  - !ruby/object:Gem::Version
339
366
  version: '0'
340
367
  required_rubygems_version: !ruby/object:Gem::Requirement
341
368
  requirements:
342
- - - '>='
369
+ - - ">="
343
370
  - !ruby/object:Gem::Version
344
371
  version: '0'
345
372
  requirements:
346
373
  - 'LibGit2 dependencies for rugged: https://github.com/libgit2/libgit2#optional-dependencies,
347
374
  also CMake and pkg-config'
348
375
  rubyforge_project:
349
- rubygems_version: 2.0.14
376
+ rubygems_version: 2.5.1
350
377
  signing_key:
351
378
  specification_version: 4
352
379
  summary: Automate tasks with Jenkins
353
380
  test_files:
381
+ - spec/app_spec.rb
382
+ - spec/leeroy_spec.rb
354
383
  - spec/spec_helper.rb
355
384
  - spec/support/aruba.rb
385
+ - spec/task/base_spec.rb
386
+ - spec/task/packer_spec.rb
387
+ - spec/task/stub_spec.rb
388
+ - spec/types/packer_spec.rb
356
389
  - spec/use_aruba_with_rspec_spec.rb