leeroy_app 0.1.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 +7 -0
- data/.gitignore +40 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +103 -0
- data/LICENSE +21 -0
- data/README.md +40 -0
- data/Rakefile +5 -0
- data/bin/leeroy +18 -0
- data/hierarchy.md +39 -0
- data/leeroy.gemspec +42 -0
- data/lib/leeroy/app.rb +132 -0
- data/lib/leeroy/env.rb +116 -0
- data/lib/leeroy/helpers/aws.rb +403 -0
- data/lib/leeroy/helpers/dumpable.rb +72 -0
- data/lib/leeroy/helpers/env.rb +42 -0
- data/lib/leeroy/helpers/logging.rb +36 -0
- data/lib/leeroy/helpers/polling.rb +67 -0
- data/lib/leeroy/helpers/state.rb +59 -0
- data/lib/leeroy/helpers.rb +9 -0
- data/lib/leeroy/state.rb +70 -0
- data/lib/leeroy/task/base.rb +61 -0
- data/lib/leeroy/task/image.rb +126 -0
- data/lib/leeroy/task/instantiate.rb +200 -0
- data/lib/leeroy/task/sleep.rb +29 -0
- data/lib/leeroy/task/stub.rb +40 -0
- data/lib/leeroy/task/terminate.rb +49 -0
- data/lib/leeroy/task.rb +17 -0
- data/lib/leeroy/types/dash.rb +17 -0
- data/lib/leeroy/types/image.rb +53 -0
- data/lib/leeroy/types/instance.rb +67 -0
- data/lib/leeroy/types/mash.rb +17 -0
- data/lib/leeroy/types/packedstring.rb +25 -0
- data/lib/leeroy/types/phase.rb +20 -0
- data/lib/leeroy/types/semaphore.rb +30 -0
- data/lib/leeroy/types/statedata.rb +44 -0
- data/lib/leeroy/types/statemetadata.rb +29 -0
- data/lib/leeroy/types/userdata.rb +13 -0
- data/lib/leeroy/version.rb +3 -0
- data/lib/leeroy.rb +7 -0
- data/spec/spec_helper.rb +105 -0
- data/spec/support/aruba.rb +1 -0
- data/spec/use_aruba_with_rspec_spec.rb +11 -0
- metadata +333 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a33c630bfff44d8f1fbaff8694c65891aef0f8c5
|
4
|
+
data.tar.gz: ad0999e31aec974b08fb8f1e10c268b62a653004
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: faf7735d2cdcd8f9cf9cb0e834210f465802fb614845bdca5c8ccd7bb1f3bd8da3d81cda343c036bfe2cf1488d32196c7b28ee6eb5d2c7dab40fc96aa2eedf0e
|
7
|
+
data.tar.gz: a5c965a55dc5be2683f0f27e98405e7c200ef6f0566ef000b62e760d8150e3e58b57c2e4b74193fd697abfb35949e3c1dfc853adb932fc423ed4109a0065dddf
|
data/.gitignore
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/test/tmp/
|
9
|
+
/test/version_tmp/
|
10
|
+
/tmp/
|
11
|
+
|
12
|
+
## Specific to RubyMotion:
|
13
|
+
.dat*
|
14
|
+
.repl_history
|
15
|
+
build/
|
16
|
+
|
17
|
+
## Documentation cache and generated files:
|
18
|
+
/.yardoc/
|
19
|
+
/_yardoc/
|
20
|
+
/doc/
|
21
|
+
/rdoc/
|
22
|
+
|
23
|
+
## Environment normalisation:
|
24
|
+
/.bundle/
|
25
|
+
/vendor/bundle
|
26
|
+
/lib/bundler/man/
|
27
|
+
|
28
|
+
## Application configuration
|
29
|
+
.env
|
30
|
+
.env*
|
31
|
+
*.log
|
32
|
+
|
33
|
+
# for a library or gem, you might want to ignore these files since the code is
|
34
|
+
# intended to run in multiple environments; otherwise, check them in:
|
35
|
+
# Gemfile.lock
|
36
|
+
# .ruby-version
|
37
|
+
# .ruby-gemset
|
38
|
+
|
39
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
40
|
+
.rvmrc
|
data/.rspec
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0-p645
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
leeroy_app (0.1.0)
|
5
|
+
awesome_print (~> 1.6)
|
6
|
+
aws-sdk (~> 2)
|
7
|
+
chronic (~> 0.10)
|
8
|
+
dotenv (~> 2.1)
|
9
|
+
gli (~> 2.13)
|
10
|
+
hashie (~> 3.4)
|
11
|
+
multi_json (~> 1.11)
|
12
|
+
rugged (~> 0.23)
|
13
|
+
smart_polling (~> 1.0)
|
14
|
+
yell (~> 2.0)
|
15
|
+
yell-adapters-syslog (~> 2.0)
|
16
|
+
|
17
|
+
GEM
|
18
|
+
remote: https://rubygems.org/
|
19
|
+
specs:
|
20
|
+
aruba (0.11.1)
|
21
|
+
childprocess (~> 0.5.6)
|
22
|
+
contracts (~> 0.9)
|
23
|
+
cucumber (>= 1.3.19)
|
24
|
+
event-bus (~> 0.2)
|
25
|
+
ffi (~> 1.9.10)
|
26
|
+
rspec-expectations (>= 2.99)
|
27
|
+
thor (~> 0.19)
|
28
|
+
awesome_print (1.6.1)
|
29
|
+
aws-sdk (2.2.20)
|
30
|
+
aws-sdk-resources (= 2.2.20)
|
31
|
+
aws-sdk-core (2.2.20)
|
32
|
+
jmespath (~> 1.0)
|
33
|
+
aws-sdk-resources (2.2.20)
|
34
|
+
aws-sdk-core (= 2.2.20)
|
35
|
+
builder (3.2.2)
|
36
|
+
childprocess (0.5.9)
|
37
|
+
ffi (~> 1.0, >= 1.0.11)
|
38
|
+
chronic (0.10.2)
|
39
|
+
coderay (1.1.0)
|
40
|
+
contracts (0.12.0)
|
41
|
+
cucumber (2.1.0)
|
42
|
+
builder (>= 2.1.2)
|
43
|
+
cucumber-core (~> 1.3.0)
|
44
|
+
diff-lcs (>= 1.1.3)
|
45
|
+
gherkin3 (~> 3.1.0)
|
46
|
+
multi_json (>= 1.7.5, < 2.0)
|
47
|
+
multi_test (>= 0.1.2)
|
48
|
+
cucumber-core (1.3.1)
|
49
|
+
gherkin3 (~> 3.1.0)
|
50
|
+
diff-lcs (1.2.5)
|
51
|
+
dotenv (2.1.0)
|
52
|
+
event-bus (0.2.3)
|
53
|
+
ffi (1.9.10)
|
54
|
+
gherkin3 (3.1.2)
|
55
|
+
gli (2.13.4)
|
56
|
+
hashie (3.4.3)
|
57
|
+
jmespath (1.1.3)
|
58
|
+
method_source (0.8.2)
|
59
|
+
multi_json (1.11.2)
|
60
|
+
multi_test (0.1.2)
|
61
|
+
pry (0.10.3)
|
62
|
+
coderay (~> 1.1.0)
|
63
|
+
method_source (~> 0.8.1)
|
64
|
+
slop (~> 3.4)
|
65
|
+
pry-awesome_print (9.6.10)
|
66
|
+
awesome_print (>= 1.1.0, < 999)
|
67
|
+
pry (>= 0.9.0, < 999)
|
68
|
+
rake (10.4.2)
|
69
|
+
rspec (3.4.0)
|
70
|
+
rspec-core (~> 3.4.0)
|
71
|
+
rspec-expectations (~> 3.4.0)
|
72
|
+
rspec-mocks (~> 3.4.0)
|
73
|
+
rspec-core (3.4.1)
|
74
|
+
rspec-support (~> 3.4.0)
|
75
|
+
rspec-expectations (3.4.0)
|
76
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
77
|
+
rspec-support (~> 3.4.0)
|
78
|
+
rspec-mocks (3.4.1)
|
79
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
80
|
+
rspec-support (~> 3.4.0)
|
81
|
+
rspec-support (3.4.1)
|
82
|
+
rugged (0.23.3)
|
83
|
+
slop (3.6.0)
|
84
|
+
smart_polling (1.0.0)
|
85
|
+
thor (0.19.1)
|
86
|
+
yell (2.0.5)
|
87
|
+
yell-adapters-syslog (2.0.2)
|
88
|
+
yell (~> 2.0)
|
89
|
+
|
90
|
+
PLATFORMS
|
91
|
+
ruby
|
92
|
+
|
93
|
+
DEPENDENCIES
|
94
|
+
aruba (~> 0.11.1)
|
95
|
+
bundler (~> 1.6)
|
96
|
+
leeroy_app!
|
97
|
+
pry (~> 0.10)
|
98
|
+
pry-awesome_print (~> 9.6)
|
99
|
+
rake (~> 10.0)
|
100
|
+
rspec (~> 3.3)
|
101
|
+
|
102
|
+
BUNDLED WITH
|
103
|
+
1.11.2
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 FitnessKeeper
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# leeroy
|
2
|
+
o rly? ya rly!
|
3
|
+
|
4
|
+
## Installation/Configuration
|
5
|
+
|
6
|
+
### Development
|
7
|
+
|
8
|
+
$ bundle install
|
9
|
+
$ ./bin/leeroy env -d > .env
|
10
|
+
$ $EDITOR .env
|
11
|
+
|
12
|
+
### Production
|
13
|
+
|
14
|
+
$ gem install leeroy_app
|
15
|
+
$ leeroy env -p -d >> ~/.profile
|
16
|
+
$ $EDITOR ~/.profile
|
17
|
+
|
18
|
+
## Usage
|
19
|
+
|
20
|
+
### General
|
21
|
+
|
22
|
+
leeroy is a "git-like" application; it takes GNU-style command-line options, global options come before the subcommand, command-specific options come after the subcommand.
|
23
|
+
|
24
|
+
$ leeroy --help
|
25
|
+
|
26
|
+
### Jenkins workflow
|
27
|
+
|
28
|
+
Create a new gold master image:
|
29
|
+
|
30
|
+
$ leeroy instantiate --phase gold_master | leeroy image | leeroy terminate
|
31
|
+
|
32
|
+
Create a new application image:
|
33
|
+
|
34
|
+
$ leeroy instantiate --phase application | leeroy image | leeroy terminate
|
35
|
+
|
36
|
+
### Provisioning workflow
|
37
|
+
|
38
|
+
FIXME not implemented yet
|
39
|
+
|
40
|
+
$ leeroy bootstrap | leeroy provision
|
data/Rakefile
ADDED
data/bin/leeroy
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'dotenv'
|
4
|
+
Dotenv.load
|
5
|
+
|
6
|
+
if ENV['ENVIRONMENT'] == 'development'
|
7
|
+
require 'bundler/setup'
|
8
|
+
require 'pry'
|
9
|
+
end
|
10
|
+
|
11
|
+
lib = File.expand_path('../lib', __FILE__)
|
12
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
13
|
+
|
14
|
+
require 'leeroy/app'
|
15
|
+
|
16
|
+
include Leeroy::App
|
17
|
+
|
18
|
+
# vim: set et fenc= ft=ruby ff=unix sts=2 sw=2 ts=2 :
|
data/hierarchy.md
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
## General principles
|
2
|
+
|
3
|
+
* Objects interact with the world outside the program (_e.g._ I/O)
|
4
|
+
* Objects contain state
|
5
|
+
* Modules provide traits/behaviors/information common to multiple objects (_e.g._ logging)
|
6
|
+
* The Leeroy::App namespace defines the CLI (commands, runtime configuration)
|
7
|
+
* The Leeroy::Data namespace defines the persistence layer
|
8
|
+
* The Leeroy::Task namespace defines the application's capabilities
|
9
|
+
* The Leeroy::Helpers namespace contains only helper modules, no class definitions
|
10
|
+
|
11
|
+
## Hierarchy
|
12
|
+
|
13
|
+
classes are marked with `*`
|
14
|
+
|
15
|
+
```
|
16
|
+
Leeroy
|
17
|
+
|
18
|
+
Leeroy::App
|
19
|
+
Leeroy::App::Command
|
20
|
+
Leeroy::App::Command::Config
|
21
|
+
Leeroy::App::Command::Env
|
22
|
+
Leeroy::App::Command::State
|
23
|
+
Leeroy::App::Command::Task
|
24
|
+
Leeroy::App::Command::Version
|
25
|
+
|
26
|
+
Leeroy::Helpers
|
27
|
+
Leeroy::Helpers::AWS
|
28
|
+
Leeroy::Helpers::Env
|
29
|
+
Leeroy::Helpers::Polling
|
30
|
+
Leeroy::Helpers::State
|
31
|
+
|
32
|
+
Leeroy::Task
|
33
|
+
Leeroy::Task::Base *
|
34
|
+
Leeroy::Task::RunInstance *
|
35
|
+
Leeroy::Task::ImageInstance *
|
36
|
+
Leeroy::Task::TerminateInstance *
|
37
|
+
|
38
|
+
Leeroy::Version
|
39
|
+
```
|
data/leeroy.gemspec
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'leeroy/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "leeroy_app"
|
8
|
+
spec.version = Leeroy::VERSION
|
9
|
+
spec.authors = ["Steve Huff"]
|
10
|
+
spec.email = ["steve.huff@runkeeper.com"]
|
11
|
+
spec.summary = %q{Automate tasks with Jenkins}
|
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
|
+
spec.homepage = "https://github.com/FitnessKeeper/leeroy"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# external dependencies for building gems
|
22
|
+
spec.requirements << 'LibGit2 dependencies for rugged: https://github.com/libgit2/libgit2#optional-dependencies, also CMake and pkg-config'
|
23
|
+
|
24
|
+
spec.add_development_dependency "aruba", "~> 0.11.1"
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.6"
|
26
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
27
|
+
spec.add_development_dependency "rspec", "~> 3.3"
|
28
|
+
spec.add_development_dependency "pry", "~> 0.10"
|
29
|
+
spec.add_development_dependency "pry-awesome_print", "~> 9.6"
|
30
|
+
|
31
|
+
spec.add_runtime_dependency "awesome_print", "~> 1.6"
|
32
|
+
spec.add_runtime_dependency "aws-sdk", "~> 2"
|
33
|
+
spec.add_runtime_dependency "chronic", "~> 0.10"
|
34
|
+
spec.add_runtime_dependency "dotenv", "~> 2.1"
|
35
|
+
spec.add_runtime_dependency "gli", "~> 2.13"
|
36
|
+
spec.add_runtime_dependency "hashie", "~> 3.4"
|
37
|
+
spec.add_runtime_dependency "multi_json", "~> 1.11"
|
38
|
+
spec.add_runtime_dependency "rugged", "~> 0.23"
|
39
|
+
spec.add_runtime_dependency "smart_polling", "~> 1.0"
|
40
|
+
spec.add_runtime_dependency "yell", "~> 2.0"
|
41
|
+
spec.add_runtime_dependency "yell-adapters-syslog", "~> 2.0"
|
42
|
+
end
|
data/lib/leeroy/app.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'gli'
|
4
|
+
|
5
|
+
require 'leeroy'
|
6
|
+
require 'leeroy/task/image'
|
7
|
+
require 'leeroy/task/instantiate'
|
8
|
+
require 'leeroy/task/terminate'
|
9
|
+
require 'leeroy/task/sleep'
|
10
|
+
require 'leeroy/task/stub'
|
11
|
+
|
12
|
+
include GLI::App
|
13
|
+
|
14
|
+
module Leeroy
|
15
|
+
module App
|
16
|
+
|
17
|
+
# constants
|
18
|
+
VALID_PHASE = ['gold_master','application']
|
19
|
+
|
20
|
+
program_desc 'Automate tasks with Jenkins'
|
21
|
+
|
22
|
+
# global options
|
23
|
+
desc "Perform the requested task (pass '--no-op' for testing)."
|
24
|
+
switch [:op], :default_value => true
|
25
|
+
|
26
|
+
desc 'Displays the version of leeroy and exits.'
|
27
|
+
command :version do |c|
|
28
|
+
c.action do |global_options,options,args|
|
29
|
+
printf("leeroy %s\n", Leeroy::VERSION)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "Displays leeroy's environment settings."
|
34
|
+
command :env do |c|
|
35
|
+
c.desc "Use default environment settings instead of reading from shell environment."
|
36
|
+
c.switch :default, :d
|
37
|
+
|
38
|
+
c.desc "Format environment settings for use in .profile."
|
39
|
+
c.switch :profile, :p
|
40
|
+
|
41
|
+
c.action do |global_options,options,args|
|
42
|
+
puts Leeroy::Env.new(options).to_s
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "Instantiates an EC2 instance for imaging."
|
47
|
+
command :instantiate do |c|
|
48
|
+
|
49
|
+
valid_phase = VALID_PHASE
|
50
|
+
c.desc "Phase of deploy process for which to deploy (must be one of #{valid_phase.sort})."
|
51
|
+
c.flag [:p, :phase], :must_match => valid_phase
|
52
|
+
|
53
|
+
c.action do |global_options,options,args|
|
54
|
+
# validate input
|
55
|
+
unless options[:phase].nil? or valid_phase.include?(options[:phase])
|
56
|
+
help_now! "Valid arguments for '--phase' are: #{valid_phase.sort.join(',')}."
|
57
|
+
end
|
58
|
+
|
59
|
+
task = Leeroy::Task::Instantiate.new(global_options: global_options, options: options, args: args)
|
60
|
+
task.perform
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
desc "Terminates an EC2 instance."
|
65
|
+
command :terminate do |c|
|
66
|
+
|
67
|
+
c.desc "Instance ID (or IDs as comma-delimited strings) to terminate (reads from state if none provided)."
|
68
|
+
c.flag [:i, :instance], :type => Array
|
69
|
+
|
70
|
+
c.action do |global_options,options,args|
|
71
|
+
task = Leeroy::Task::Terminate.new(global_options: global_options, options: options, args: args)
|
72
|
+
task.perform
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "Creates an image from a running EC2 instance."
|
77
|
+
command :image do |c|
|
78
|
+
|
79
|
+
valid_phase = VALID_PHASE
|
80
|
+
c.desc "Phase of deploy process for which to deploy (must be one of #{valid_phase.sort})."
|
81
|
+
c.flag [:p, :phase]
|
82
|
+
|
83
|
+
c.desc "Instance ID from which to image (optional, will be extracted from state if not provided)."
|
84
|
+
c.flag [:i, :instance]
|
85
|
+
|
86
|
+
c.desc "Image index (optional, will be calculated if not provided)."
|
87
|
+
c.flag [:n, :index]
|
88
|
+
|
89
|
+
c.action do |global_options,options,args|
|
90
|
+
# validate input
|
91
|
+
unless options[:phase].nil? or valid_phase.include?(options[:phase])
|
92
|
+
help_now! "Valid arguments for '--phase' are: #{valid_phase.sort.join(',')}."
|
93
|
+
end
|
94
|
+
|
95
|
+
# index must be nil or must look like a positive integer
|
96
|
+
begin
|
97
|
+
unless options[:index].nil? or options[:index].to_i > 0
|
98
|
+
help_now! "The argument for '--index' must be a positive integer."
|
99
|
+
end
|
100
|
+
|
101
|
+
rescue NoMethodError => e
|
102
|
+
help_now! "The argument for '--index' must be a positive integer."
|
103
|
+
end
|
104
|
+
|
105
|
+
task = Leeroy::Task::Image.new(global_options: global_options, options: options, args: args)
|
106
|
+
task.perform
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
desc "Sleeps for some number of seconds."
|
111
|
+
command :sleep do |c|
|
112
|
+
c.desc "Number of seconds to sleep."
|
113
|
+
c.flag [:i, :interval], :default_value => 2
|
114
|
+
|
115
|
+
c.action do |global_options,options,args|
|
116
|
+
Leeroy::Task::Sleep.new(global_options: global_options, options: options, args: args).perform
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
desc "Runs the stub task."
|
121
|
+
command :stub do |c|
|
122
|
+
c.desc "Amount by which to increment the stub value"
|
123
|
+
c.flag [:i, :increment], :default_value => 1
|
124
|
+
c.action do |global_options,options,args|
|
125
|
+
task = Leeroy::Task::Stub.new(global_options: global_options, options: options, args: args)
|
126
|
+
task.perform
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
exit run(ARGV)
|
131
|
+
end
|
132
|
+
end
|
data/lib/leeroy/env.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'dotenv'
|
2
|
+
Dotenv.load
|
3
|
+
|
4
|
+
require 'leeroy/types/mash'
|
5
|
+
require 'leeroy/helpers/dumpable'
|
6
|
+
require 'leeroy/helpers/env'
|
7
|
+
require 'leeroy/helpers/logging'
|
8
|
+
|
9
|
+
module Leeroy
|
10
|
+
class Env < Leeroy::Types::Mash
|
11
|
+
include Leeroy::Helpers::Dumpable
|
12
|
+
include Leeroy::Helpers::Env
|
13
|
+
include Leeroy::Helpers::Logging
|
14
|
+
|
15
|
+
# constants
|
16
|
+
S3_PREFIXES = {
|
17
|
+
:secrets => 'secrets',
|
18
|
+
:jenkins => 'jenkins',
|
19
|
+
:builds => 'builds',
|
20
|
+
:logs => 'logs',
|
21
|
+
:semaphores => 'semaphores',
|
22
|
+
:tests => 'tests',
|
23
|
+
}
|
24
|
+
|
25
|
+
ENV_DEFAULTS = {
|
26
|
+
'LEEROY_APP_NAME' => '<identifying string, e.g. "tomcat7">',
|
27
|
+
'LEEROY_AWS_LINUX_AMI' => '<AMI ID to be used as base for gold master>',
|
28
|
+
'LEEROY_BUILD_INSTANCE_TYPE' => '<EC2 instance type to be used for imaging>',
|
29
|
+
'LEEROY_BUILD_PROFILE_NAME' => '<IAM instance profile name to be applied to imaging instances>',
|
30
|
+
'LEEROY_BUILD_SECURITY_GROUP' => '<VPC security group name to be applied to imaging instances>',
|
31
|
+
'LEEROY_BUILD_SSH_KEYPAIR' => '<SSH keypair name for access to imaging instances>',
|
32
|
+
'LEEROY_BUILD_SUBNET' => '<VPC subnet name to be applied to imaging instances>',
|
33
|
+
'LEEROY_BUILD_TARGET' => '<identifying string for application build, e.g. "webapi" or "stage20">',
|
34
|
+
'LEEROY_BUILD_VPC' => '<VPC name in which imaging instances are created>',
|
35
|
+
'LEEROY_GOLD_MASTER_IMAGE_PREFIX' => '<identifying string used to generate AMI names>',
|
36
|
+
'LEEROY_GOLD_MASTER_NAME' => '<identifying string used to tag gold master instances during imaging>',
|
37
|
+
'LEEROY_POLL_INTERVAL' => '<number of seconds to wait between polling for long-running AWS operations>',
|
38
|
+
'LEEROY_POLL_TIMEOUT' => '<number of seconds to wait between giving up on long-running AWS operations>',
|
39
|
+
'LEEROY_PROVISIONING_TEMPLATE_PREFIX' => '<path on local filesystem to directory containing provisioning templates>',
|
40
|
+
'LEEROY_S3_BUCKET' => '<name of bucket used as datastore>',
|
41
|
+
'LEEROY_PROVISIONING_TEMPLATE_PREFIX' => '<path on local filesystem to directory containing user-data templates>',
|
42
|
+
}
|
43
|
+
|
44
|
+
ENV_EXTRAS = {
|
45
|
+
'ENVIRONMENT' => '<development or production>',
|
46
|
+
'GLI_DEBUG' => '<true or false>',
|
47
|
+
'AWS_REGION' => '<your AWS region>',
|
48
|
+
}
|
49
|
+
|
50
|
+
# attr_reader :default, :profile
|
51
|
+
attr_reader :profile, :defaults
|
52
|
+
|
53
|
+
def initialize(options = {}, env = ENV)
|
54
|
+
begin
|
55
|
+
logger.debug "initializing #{self.class}"
|
56
|
+
logger.debug "options: #{options.inspect}"
|
57
|
+
|
58
|
+
@defaults = options[:default]
|
59
|
+
@profile = options[:profile]
|
60
|
+
|
61
|
+
if self.defaults
|
62
|
+
unfiltered = ENV_DEFAULTS
|
63
|
+
extras = ENV_EXTRAS
|
64
|
+
else
|
65
|
+
unfiltered = env
|
66
|
+
extras = {}
|
67
|
+
end
|
68
|
+
|
69
|
+
filtered = _filterEnv(unfiltered).merge(extras)
|
70
|
+
logger.debug "filtered: #{filtered.inspect}"
|
71
|
+
|
72
|
+
self.dump_properties = filtered.keys.sort.collect { |x| x.to_sym }
|
73
|
+
super(filtered)
|
74
|
+
|
75
|
+
rescue StandardError => e
|
76
|
+
raise e
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def to_s
|
81
|
+
_prettyPrint
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def _prettyPrint
|
87
|
+
if self.profile
|
88
|
+
formatstr = 'export %s=%s'
|
89
|
+
header = '# environment variables for leeroy configuration'
|
90
|
+
else
|
91
|
+
formatstr = '%s=%s'
|
92
|
+
header = nil
|
93
|
+
end
|
94
|
+
|
95
|
+
if self.defaults
|
96
|
+
formatstr = '# '.concat(formatstr)
|
97
|
+
end
|
98
|
+
|
99
|
+
properties = self.dump_properties.collect {|x| x.to_s}.sort.collect {|x| sprintf(formatstr, x, self.fetch(x))}
|
100
|
+
|
101
|
+
properties.unshift(header) unless header.nil?
|
102
|
+
|
103
|
+
properties.join("\n")
|
104
|
+
end
|
105
|
+
|
106
|
+
def _filterEnv(env, prefix = 'LEEROY_')
|
107
|
+
begin
|
108
|
+
logger.debug("filtering env by prefix '#{prefix}'")
|
109
|
+
env.select { |k,v| k.start_with?(prefix) }
|
110
|
+
|
111
|
+
rescue StandardError => e
|
112
|
+
raise e
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|