Infer push name when only one strategy is defined, support multiple strategies
This commit is contained in:
parent
35dbb8db7d
commit
6b48199346
|
@ -571,7 +571,7 @@ module Vagrant
|
||||||
#
|
#
|
||||||
# @return [Array<Symbol>]
|
# @return [Array<Symbol>]
|
||||||
def pushes
|
def pushes
|
||||||
vagrantfile.config.push.__compiled_pushes.keys
|
self.vagrantfile.config.push.__compiled_pushes.keys
|
||||||
end
|
end
|
||||||
|
|
||||||
# This returns a machine with the proper provider for this environment.
|
# This returns a machine with the proper provider for this environment.
|
||||||
|
|
|
@ -7,56 +7,73 @@ module VagrantPlugins
|
||||||
"deploys code in this environment to a configured destination"
|
"deploys code in this environment to a configured destination"
|
||||||
end
|
end
|
||||||
|
|
||||||
# @todo support multiple strategies if requested by the community
|
|
||||||
def execute
|
def execute
|
||||||
|
options = { all: false }
|
||||||
opts = OptionParser.new do |o|
|
opts = OptionParser.new do |o|
|
||||||
o.banner = "Usage: vagrant push [strategy] [options]"
|
o.banner = "Usage: vagrant push [strategy] [options]"
|
||||||
|
o.on("-a", "--all", "Run all defined push strategies") do
|
||||||
|
options[:all] = true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Parse the options
|
# Parse the options
|
||||||
argv = parse_options(opts)
|
argv = parse_options(opts)
|
||||||
return if !argv
|
return if !argv
|
||||||
|
|
||||||
name = argv[0]
|
names = validate_pushes!(@env.pushes, argv, options)
|
||||||
pushes = @env.pushes
|
|
||||||
|
|
||||||
validate_pushes!(pushes, name)
|
|
||||||
|
|
||||||
|
names.each do |name|
|
||||||
@logger.debug("'push' environment with strategy: `#{name}'")
|
@logger.debug("'push' environment with strategy: `#{name}'")
|
||||||
@env.push(name)
|
@env.push(name)
|
||||||
|
end
|
||||||
|
|
||||||
0
|
0
|
||||||
end
|
end
|
||||||
|
|
||||||
# Validate that the given list of pushes and strategy are valid.
|
# Validate that the given list of names corresponds to valid pushes.
|
||||||
#
|
#
|
||||||
# @raise [PushesNotDefined] if there are no pushes defined for the
|
# @raise Vagrant::Errors::PushesNotDefined
|
||||||
# environment
|
# if there are no pushes defined
|
||||||
# @raise [PushStrategyNotDefined] if a strategy is given, but does not
|
# @raise Vagrant::Errors::PushStrategyNotProvided
|
||||||
# correspond to one that exists in the environment
|
# if there are multiple push strategies defined and none were specified
|
||||||
|
# and `--all` was not given
|
||||||
|
# @raise Vagrant::Errors::PushStrategyNotDefined
|
||||||
|
# if any of the given push names do not correspond to a push strategy
|
||||||
#
|
#
|
||||||
# @param [Registry] pushes The list of pushes as a {Registry}
|
# @param [Array<Symbol>] pushes
|
||||||
# @param [#to_sym, nil] name The name of the strategy
|
# the list of pushes defined by the environment
|
||||||
|
# @param [Array<String>] names
|
||||||
|
# the list of names provided by the user on the command line
|
||||||
|
# @param [Hash] options
|
||||||
|
# a list of options to pass to the validation
|
||||||
#
|
#
|
||||||
# @return [true]
|
# @return [Array<Symbol>]
|
||||||
def validate_pushes!(pushes, name=nil)
|
# the compiled list of pushes
|
||||||
|
#
|
||||||
|
def validate_pushes!(pushes, names = [], options = {})
|
||||||
if pushes.nil? || pushes.empty?
|
if pushes.nil? || pushes.empty?
|
||||||
raise Vagrant::Errors::PushesNotDefined
|
raise Vagrant::Errors::PushesNotDefined
|
||||||
end
|
end
|
||||||
|
|
||||||
if name.nil?
|
names = Array(names).flatten.compact.map(&:to_sym)
|
||||||
if pushes.length != 1
|
|
||||||
|
if names.empty? || options[:all]
|
||||||
|
if options[:all] || pushes.length == 1
|
||||||
|
return pushes.map(&:to_sym)
|
||||||
|
else
|
||||||
raise Vagrant::Errors::PushStrategyNotProvided, pushes: pushes
|
raise Vagrant::Errors::PushStrategyNotProvided, pushes: pushes
|
||||||
end
|
end
|
||||||
else
|
end
|
||||||
if !pushes.include?(name.to_sym)
|
|
||||||
|
names.each do |name|
|
||||||
|
if !pushes.include?(name)
|
||||||
raise Vagrant::Errors::PushStrategyNotDefined,
|
raise Vagrant::Errors::PushStrategyNotDefined,
|
||||||
name: name,
|
name: name,
|
||||||
pushes: pushes
|
pushes: pushes
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
true
|
return names
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -25,15 +25,35 @@ describe VagrantPlugins::CommandPush::Command do
|
||||||
describe "#execute" do
|
describe "#execute" do
|
||||||
before do
|
before do
|
||||||
allow(subject).to receive(:validate_pushes!)
|
allow(subject).to receive(:validate_pushes!)
|
||||||
|
.and_return([:noop])
|
||||||
allow(env).to receive(:pushes)
|
allow(env).to receive(:pushes)
|
||||||
allow(env).to receive(:push)
|
allow(env).to receive(:push)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "validates the pushes" do
|
it "validates the pushes" do
|
||||||
expect(subject).to receive(:validate_pushes!).once
|
expect(subject).to receive(:validate_pushes!)
|
||||||
|
.with(nil, argv, kind_of(Hash))
|
||||||
|
.once
|
||||||
subject.execute
|
subject.execute
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "parses arguments" do
|
||||||
|
list = ["noop", "ftp"]
|
||||||
|
instance = described_class.new(list, env)
|
||||||
|
expect(instance).to receive(:validate_pushes!)
|
||||||
|
.with(nil, list, kind_of(Hash))
|
||||||
|
.and_return([])
|
||||||
|
instance.execute
|
||||||
|
end
|
||||||
|
|
||||||
|
it "parses options" do
|
||||||
|
instance = described_class.new(["--all"], env)
|
||||||
|
expect(instance).to receive(:validate_pushes!)
|
||||||
|
.with(nil, argv, all: true)
|
||||||
|
.and_return([])
|
||||||
|
instance.execute
|
||||||
|
end
|
||||||
|
|
||||||
it "delegates to Environment#push" do
|
it "delegates to Environment#push" do
|
||||||
expect(env).to receive(:push).once
|
expect(env).to receive(:push).once
|
||||||
subject.execute
|
subject.execute
|
||||||
|
@ -72,17 +92,22 @@ describe VagrantPlugins::CommandPush::Command do
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when that strategy is defined" do
|
context "when that strategy is defined" do
|
||||||
it "does not raise an exception" do
|
it "returns that push" do
|
||||||
expect { subject.validate_pushes!(pushes, :noop) }
|
expect(subject.validate_pushes!(pushes, :noop)).to eq([:noop])
|
||||||
.to_not raise_error
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when no strategy is given" do
|
context "when no strategy is given" do
|
||||||
it "does not raise an exception" do
|
it "returns the push" do
|
||||||
expect { subject.validate_pushes!(pushes) }
|
expect(subject.validate_pushes!(pushes)).to eq([:noop])
|
||||||
.to_not raise_error
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when --all is given" do
|
||||||
|
it "returns the push" do
|
||||||
|
expect(subject.validate_pushes!(pushes, [], all: true))
|
||||||
|
.to eq([:noop])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -101,21 +126,33 @@ describe VagrantPlugins::CommandPush::Command do
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when that strategy is defined" do
|
context "when that strategy is defined" do
|
||||||
it "does not raise an exception" do
|
it "returns the strategy" do
|
||||||
expect { subject.validate_pushes!(pushes, :noop) }
|
expect(subject.validate_pushes!(pushes, :noop)).to eq([:noop])
|
||||||
.to_not raise_error
|
expect(subject.validate_pushes!(pushes, :ftp)).to eq([:ftp])
|
||||||
expect { subject.validate_pushes!(pushes, :ftp) }
|
|
||||||
.to_not raise_error
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "when multiple strategies are given" do
|
||||||
|
it "returns the pushes" do
|
||||||
|
expect(subject.validate_pushes!(pushes, [:noop, :ftp]))
|
||||||
|
.to eq([:noop, :ftp])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context "when no strategy is given" do
|
context "when no strategy is given" do
|
||||||
it "raises an exception" do
|
it "raises an exception" do
|
||||||
expect { subject.validate_pushes!(pushes) }
|
expect { subject.validate_pushes!(pushes) }
|
||||||
.to raise_error(Vagrant::Errors::PushStrategyNotProvided)
|
.to raise_error(Vagrant::Errors::PushStrategyNotProvided)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "when --all is given" do
|
||||||
|
it "returns the pushes" do
|
||||||
|
expect(subject.validate_pushes!(pushes, [], all: true))
|
||||||
|
.to eq([:noop, :ftp])
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -52,6 +52,16 @@ subcommand:
|
||||||
$ vagrant push staging
|
$ vagrant push staging
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Pushes will be run in the order you specify on the command line, **not the order
|
||||||
|
they are specified in the `Vagrantfile`!**
|
||||||
|
|
||||||
|
To execute all the Vagrant Push strategies, specify the `--all` flag with no
|
||||||
|
other arguments:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ vagrant push --all
|
||||||
|
```
|
||||||
|
|
||||||
Vagrant Push is the easiest way to deploy your application. You can read more
|
Vagrant Push is the easiest way to deploy your application. You can read more
|
||||||
in the documentation links on the sidebar.
|
in the documentation links on the sidebar.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue