soyuz 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.markdown +5 -0
- data/README.md +10 -2
- data/bin/soyuz +7 -1
- data/lib/soyuz/command_choice.rb +16 -3
- data/lib/soyuz/config.rb +5 -6
- data/lib/soyuz/deploy.rb +10 -5
- data/lib/soyuz/version.rb +1 -1
- data/spec/files/{soyuz_example.yml → soyuz_incompatible.yml} +1 -1
- data/spec/files/soyuz_invalid.yml +1 -0
- data/spec/files/soyuz_non_interactive.yml +25 -0
- data/spec/files/soyuz_valid_legacy.yml +22 -0
- data/spec/files/soyuz_valid_modern.yml +24 -0
- data/spec/soyuz/config_spec.rb +47 -10
- data/spec/soyuz/deploy_spec.rb +33 -30
- data/spec/spec_helper.rb +8 -0
- metadata +12 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 473101441a21cdb99583187dbf13b0239375eae3
|
4
|
+
data.tar.gz: 3c497ec52e6914061136c10786c12c5b17463296
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb35de07fb0f54d599c9cfe2873f463515a39a3bf85b98bfca74f054155fff85588c97b72363e31e86cbe18a8e86e1e926390f7711694438fd2d60b61f6f64b8
|
7
|
+
data.tar.gz: 91cdf4828952cfa27cc0478b85dc202237d483e035a5d462f41651a4205fd93709b7a92ca13941e5cc78a093dd47f98373ad4a2188f02a5f0123f00f9869163a
|
data/.gitignore
CHANGED
data/CHANGELOG.markdown
CHANGED
data/README.md
CHANGED
@@ -33,6 +33,7 @@ environments:
|
|
33
33
|
-
|
34
34
|
display: "Deploy"
|
35
35
|
cmd: "cap $SOYUZ_ENVIRONMENT deploy:rolling"
|
36
|
+
default: true
|
36
37
|
-
|
37
38
|
display: "Deploy with Migrations"
|
38
39
|
cmd: "cap $SOYUZ_ENVIRONMENT deploy:rolling_migrations"
|
@@ -49,8 +50,9 @@ environments:
|
|
49
50
|
|
50
51
|
## Usage
|
51
52
|
|
53
|
+
Interactive:
|
52
54
|
```bash
|
53
|
-
|
55
|
+
soyuz deploy
|
54
56
|
# => 1. production
|
55
57
|
# => 2. staging
|
56
58
|
1
|
@@ -71,7 +73,13 @@ post-deploy-notes
|
|
71
73
|
# post all of your deploy notes somewhere useful
|
72
74
|
```
|
73
75
|
|
74
|
-
|
76
|
+
Non-interactive mode requires that you pass the environment argument and that all choices in your config have a default flagged.
|
77
|
+
```bash
|
78
|
+
soyuz --non_interactive deploy staging
|
79
|
+
```
|
80
|
+
|
81
|
+
|
82
|
+
## Deprecations
|
75
83
|
|
76
84
|
`:deploy_cmd` has be depricated in favor of `:deploy_cmds` to better
|
77
85
|
match the before_deploy_cmds and after_deploy_cmds symantics
|
data/bin/soyuz
CHANGED
@@ -16,6 +16,11 @@ DOCUMENTATION
|
|
16
16
|
see Soyuz's GitHub repo: https://github.com/sportngin/soyuz
|
17
17
|
"""
|
18
18
|
|
19
|
+
switch [:non_interactive], :desc => 'Non-interactive deploy using default choices.', :negatable => false
|
20
|
+
pre do |global_options, command, options, args|
|
21
|
+
$non_interactive = global_options[:non_interactive]
|
22
|
+
true
|
23
|
+
end
|
19
24
|
|
20
25
|
desc "Check your config file to ensure it's valid"
|
21
26
|
command 'check' do |c|
|
@@ -27,11 +32,12 @@ command 'check' do |c|
|
|
27
32
|
end
|
28
33
|
|
29
34
|
desc "Deploy your application"
|
35
|
+
arg_name '<environment>'
|
30
36
|
command 'deploy' do |c|
|
31
37
|
c.flag [:c, :config], :desc => 'soyuz config file', :default_value => '.soyuz.yml'
|
32
38
|
c.action do |global_options, options, args|
|
33
39
|
options = global_options.merge(options)
|
34
|
-
Soyuz::Deploy.new(options
|
40
|
+
Soyuz::Deploy.new(args.first, options).execute
|
35
41
|
end
|
36
42
|
end
|
37
43
|
|
data/lib/soyuz/command_choice.rb
CHANGED
@@ -6,13 +6,26 @@ module Soyuz
|
|
6
6
|
def initialize(choices)
|
7
7
|
raise ArgumentError, "Choices must be an array" unless choices.is_a?(Array)
|
8
8
|
@choices = choices
|
9
|
+
@default_choice = default_choice_number
|
10
|
+
raise ArgumentError, "Default choice required for non interactive mode." if @default_choice.nil? && $non_interactive
|
9
11
|
end
|
10
12
|
|
11
|
-
def
|
13
|
+
def default_choice_number
|
12
14
|
@choices.each_with_index do |choice, index|
|
13
|
-
|
15
|
+
return index+1 if choice[:default]
|
16
|
+
end
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
if @default_choice.nil?
|
22
|
+
@choices.each_with_index do |choice, index|
|
23
|
+
say "#{index+1}) #{choice[:display]}"
|
24
|
+
end
|
25
|
+
choice = ask("? ", Integer) { |q| q.in = 1..@choices.length }
|
26
|
+
else
|
27
|
+
choice = default_choice_number
|
14
28
|
end
|
15
|
-
choice = ask("? ", Integer) { |q| q.in = 1..@choices.length }
|
16
29
|
build_command(choice-1)
|
17
30
|
end
|
18
31
|
|
data/lib/soyuz/config.rb
CHANGED
@@ -39,12 +39,11 @@ module Soyuz
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def valid?
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
42
|
+
File.exists?(@config_file) && config_data.is_a?(Hash)
|
43
|
+
environments.all?{|env| env.valid?}
|
44
|
+
rescue StandardError => e
|
45
|
+
puts e.message
|
46
|
+
false
|
48
47
|
end
|
49
48
|
end
|
50
49
|
InvalidConfig = Class.new(StandardError)
|
data/lib/soyuz/deploy.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
require_relative 'config'
|
2
2
|
module Soyuz
|
3
3
|
class Deploy
|
4
|
-
def initialize(
|
5
|
-
@config = Config.new(
|
4
|
+
def initialize(env_name, options)
|
5
|
+
@config = Config.new(options[:config])
|
6
6
|
@config.validate!
|
7
|
+
set_environment(env_name) if env_name || $non_interactive
|
7
8
|
end
|
8
9
|
|
9
|
-
|
10
10
|
def execute
|
11
|
-
choose_environment
|
11
|
+
choose_environment unless @environment
|
12
|
+
ENV['SOYUZ_ENVIRONMENT'] = @environment.name.to_s
|
12
13
|
before_callbacks
|
13
14
|
deploy
|
14
15
|
after_callbacks
|
@@ -22,6 +23,11 @@ module Soyuz
|
|
22
23
|
@config.environments
|
23
24
|
end
|
24
25
|
|
26
|
+
def set_environment(env_name)
|
27
|
+
@environment = environments.detect { |env| env.name.to_s == env_name }
|
28
|
+
raise("Invalid environment '#{env_name}'.") unless @environment
|
29
|
+
end
|
30
|
+
|
25
31
|
def choose_environment
|
26
32
|
say "Choose an Environment: \n"
|
27
33
|
environments.each_with_index do |environment, index|
|
@@ -29,7 +35,6 @@ module Soyuz
|
|
29
35
|
end
|
30
36
|
choice = ask("? ", Integer) { |q| q.in = 1..environments.length }
|
31
37
|
@environment = environments[choice-1]
|
32
|
-
ENV['SOYUZ_ENVIRONMENT'] = @environment.name.to_s
|
33
38
|
end
|
34
39
|
|
35
40
|
def deploy
|
data/lib/soyuz/version.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
cat:tacos-cat:eat;tacos-!@#$
|
@@ -0,0 +1,25 @@
|
|
1
|
+
---
|
2
|
+
defaults:
|
3
|
+
deploy_cmds:
|
4
|
+
- 'echo default deploy $SOYUZ_ENVIRONMENT'
|
5
|
+
|
6
|
+
environments:
|
7
|
+
-
|
8
|
+
production:
|
9
|
+
deploy_cmds:
|
10
|
+
-
|
11
|
+
-
|
12
|
+
display: "Deploy"
|
13
|
+
cmd: "echo deploying $SOYUZ_ENVIRONMENT "
|
14
|
+
default: true
|
15
|
+
-
|
16
|
+
display: "Deploy with Migrations"
|
17
|
+
cmd: "echo deploying with migrations $SOYUZ_ENVIRONMENT"
|
18
|
+
|
19
|
+
before_deploy_cmds:
|
20
|
+
- "echo before deploy callback"
|
21
|
+
after_deploy_cmds:
|
22
|
+
- "echo after deploy callback"
|
23
|
+
-
|
24
|
+
staging: {}
|
25
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
defaults:
|
3
|
+
deploy_cmd: 'echo default deploy $SOYUZ_ENVIRONMENT'
|
4
|
+
|
5
|
+
environments:
|
6
|
+
-
|
7
|
+
production:
|
8
|
+
deploy_cmd:
|
9
|
+
-
|
10
|
+
display: "Deploy"
|
11
|
+
cmd: "echo deploying $SOYUZ_ENVIRONMENT "
|
12
|
+
-
|
13
|
+
display: "Deploy with Migrations"
|
14
|
+
cmd: "echo deploying with migrations $SOYUZ_ENVIRONMENT"
|
15
|
+
|
16
|
+
before_deploy_cmds:
|
17
|
+
- "echo before deploy callback"
|
18
|
+
after_deploy_cmds:
|
19
|
+
- "echo after deploy callback"
|
20
|
+
-
|
21
|
+
staging: {}
|
22
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
defaults:
|
3
|
+
deploy_cmds:
|
4
|
+
- 'echo default deploy $SOYUZ_ENVIRONMENT'
|
5
|
+
|
6
|
+
environments:
|
7
|
+
-
|
8
|
+
production:
|
9
|
+
deploy_cmds:
|
10
|
+
-
|
11
|
+
-
|
12
|
+
display: "Deploy"
|
13
|
+
cmd: "echo deploying $SOYUZ_ENVIRONMENT "
|
14
|
+
-
|
15
|
+
display: "Deploy with Migrations"
|
16
|
+
cmd: "echo deploying with migrations $SOYUZ_ENVIRONMENT"
|
17
|
+
|
18
|
+
before_deploy_cmds:
|
19
|
+
- "echo before deploy callback"
|
20
|
+
after_deploy_cmds:
|
21
|
+
- "echo after deploy callback"
|
22
|
+
-
|
23
|
+
staging: {}
|
24
|
+
|
data/spec/soyuz/config_spec.rb
CHANGED
@@ -2,22 +2,59 @@ require "spec_helper"
|
|
2
2
|
require "soyuz/config"
|
3
3
|
module Soyuz
|
4
4
|
describe Config do
|
5
|
-
let(:valid_config){ "files/soyuz_example.yml" }
|
6
|
-
subject { Config.new(valid_config) }
|
7
|
-
|
8
5
|
before do
|
9
|
-
|
6
|
+
$non_interactive = false
|
10
7
|
end
|
11
8
|
|
12
9
|
context "#check" do
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
context "valid modern" do
|
11
|
+
subject { Config.new(CONFIG_PATHS[:valid_modern]) }
|
12
|
+
it "to not raise an error if the config is valid" do
|
13
|
+
expect(STDOUT).to receive(:puts).with("Config file is valid. We are go for launch.")
|
14
|
+
expect{ subject.check }.to_not raise_error
|
15
|
+
end
|
16
|
+
it "to raise an InvalidConfig error in non interactive mode" do
|
17
|
+
$non_interactive = true
|
18
|
+
expect(STDOUT).to receive(:puts).with("Default choice required for non interactive mode.")
|
19
|
+
expect{ subject.check }.to raise_error(InvalidConfig)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "valid legacy" do
|
24
|
+
subject { Config.new(CONFIG_PATHS[:valid_legacy]) }
|
25
|
+
|
26
|
+
it "to not raise an error if the config is valid" do
|
27
|
+
expect(STDOUT).to receive(:puts).with("Config file is valid. We are go for launch.")
|
28
|
+
expect{ subject.check }.to_not raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "non interactive" do
|
33
|
+
subject { Config.new(CONFIG_PATHS[:non_interactive]) }
|
34
|
+
before do
|
35
|
+
$non_interactive = true
|
36
|
+
end
|
37
|
+
|
38
|
+
it "to not raise an error if the config is valid" do
|
39
|
+
expect(STDOUT).to receive(:puts).with("Config file is valid. We are go for launch.")
|
40
|
+
expect{ subject.check }.to_not raise_error
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "incompatible" do
|
45
|
+
subject { Config.new(CONFIG_PATHS[:incompatible]) }
|
46
|
+
it "to raise an InvalidConfig error if the config is invalid" do
|
47
|
+
expect(STDOUT).to receive(:puts).with("Only one definiton of deploy_cmd or deploy_cmds is allowed")
|
48
|
+
expect{ subject.check }.to raise_error(InvalidConfig)
|
49
|
+
end
|
16
50
|
end
|
17
51
|
|
18
|
-
|
19
|
-
|
20
|
-
|
52
|
+
context "invalid" do
|
53
|
+
subject { Config.new(CONFIG_PATHS[:invalid]) }
|
54
|
+
it "to raise an InvalidConfig error if the config is invalid" do
|
55
|
+
expect(STDOUT).to receive(:puts).with(kind_of(String))
|
56
|
+
expect{ subject.check }.to raise_error(InvalidConfig)
|
57
|
+
end
|
21
58
|
end
|
22
59
|
end
|
23
60
|
end
|
data/spec/soyuz/deploy_spec.rb
CHANGED
@@ -2,44 +2,47 @@ require "spec_helper"
|
|
2
2
|
require "soyuz/deploy"
|
3
3
|
module Soyuz
|
4
4
|
describe Deploy do
|
5
|
-
|
6
|
-
subject { Deploy.new(valid_config) }
|
5
|
+
subject { Deploy.new(nil, config: CONFIG_PATHS[:valid_modern]) }
|
7
6
|
|
8
7
|
before do
|
9
|
-
|
8
|
+
$non_interactive = false
|
9
|
+
allow(ENV).to receive("[]=").with("SOYUZ_ENVIRONMENT", kind_of(String))
|
10
10
|
end
|
11
11
|
|
12
12
|
context "#execute" do
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
13
|
+
context "interactive" do
|
14
|
+
before do
|
15
|
+
allow_any_instance_of(Config).to receive(:validate!)
|
16
|
+
allow_any_instance_of(HighLine).to receive(:say)
|
17
|
+
allow_any_instance_of(HighLine).to receive(:ask) { 1 }
|
18
|
+
end
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
20
|
+
it "to ask for an environment" do
|
21
|
+
expect(subject).to receive(:choose_environment).and_call_original
|
22
|
+
allow(subject).to receive(:before_callbacks)
|
23
|
+
allow(subject).to receive(:deploy)
|
24
|
+
allow(subject).to receive(:after_callbacks)
|
25
|
+
subject.execute
|
26
|
+
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
28
|
+
it "to call deploy and callbacks" do
|
29
|
+
allow(subject).to receive(:choose_environment).and_call_original
|
30
|
+
expect(subject).to receive(:before_callbacks)
|
31
|
+
expect(subject).to receive(:deploy)
|
32
|
+
expect(subject).to receive(:after_callbacks)
|
33
|
+
subject.execute
|
34
|
+
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
36
|
+
end
|
37
|
+
context "non interactive" do
|
38
|
+
subject { Deploy.new("staging", config: CONFIG_PATHS[:non_interactive]) }
|
39
|
+
it "to not ask anything" do
|
40
|
+
expect(subject).to_not receive(:choose_environment)
|
41
|
+
expect(subject).to receive(:before_callbacks)
|
42
|
+
expect(subject).to receive(:deploy)
|
43
|
+
expect(subject).to receive(:after_callbacks)
|
44
|
+
subject.execute
|
45
|
+
end
|
43
46
|
end
|
44
47
|
end
|
45
48
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -21,3 +21,11 @@ RSpec.configure do |config|
|
|
21
21
|
# --seed 1234
|
22
22
|
#config.order = 'random'
|
23
23
|
end
|
24
|
+
|
25
|
+
CONFIG_PATHS = {
|
26
|
+
valid_modern: File.expand_path("../files/soyuz_valid_modern.yml", __FILE__),
|
27
|
+
valid_legacy: File.expand_path("../files/soyuz_valid_legacy.yml", __FILE__),
|
28
|
+
non_interactive: File.expand_path("../files/soyuz_non_interactive.yml", __FILE__),
|
29
|
+
incompatible: File.expand_path("../files/soyuz_incompatible.yml", __FILE__),
|
30
|
+
invalid: File.expand_path("../files/soyuz_invalid.yml", __FILE__),
|
31
|
+
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soyuz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Fleener
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gli
|
@@ -169,7 +169,11 @@ files:
|
|
169
169
|
- lib/soyuz/support.rb
|
170
170
|
- lib/soyuz/version.rb
|
171
171
|
- soyuz.gemspec
|
172
|
-
- spec/files/
|
172
|
+
- spec/files/soyuz_incompatible.yml
|
173
|
+
- spec/files/soyuz_invalid.yml
|
174
|
+
- spec/files/soyuz_non_interactive.yml
|
175
|
+
- spec/files/soyuz_valid_legacy.yml
|
176
|
+
- spec/files/soyuz_valid_modern.yml
|
173
177
|
- spec/soyuz/command_choice_spec.rb
|
174
178
|
- spec/soyuz/command_env_spec.rb
|
175
179
|
- spec/soyuz/command_spec.rb
|
@@ -203,7 +207,11 @@ signing_key:
|
|
203
207
|
specification_version: 4
|
204
208
|
summary: The old trusty deployment toolkit
|
205
209
|
test_files:
|
206
|
-
- spec/files/
|
210
|
+
- spec/files/soyuz_incompatible.yml
|
211
|
+
- spec/files/soyuz_invalid.yml
|
212
|
+
- spec/files/soyuz_non_interactive.yml
|
213
|
+
- spec/files/soyuz_valid_legacy.yml
|
214
|
+
- spec/files/soyuz_valid_modern.yml
|
207
215
|
- spec/soyuz/command_choice_spec.rb
|
208
216
|
- spec/soyuz/command_env_spec.rb
|
209
217
|
- spec/soyuz/command_spec.rb
|