leeroy_app 0.4.0 → 0.5.4

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