c.action do |global,options,args|
init_submodules
- nodes = manager.filter!(args)
+ nodes = filter_deploy_nodes(args)
if nodes.size > 1
say "Deploying to these nodes: #{nodes.keys.join(', ')}"
if !global[:yes] && !agree("Continue? ")
return includes
end
+ #
+ # for safety, we allow production deploys to be turned off in the Leapfile.
+ #
+ def filter_deploy_nodes(filter)
+ nodes = manager.filter!(filter)
+ if !leapfile.allow_production_deploy
+ nodes = nodes[:production => false]
+ assert! nodes.any?, "Skipping deploy because @allow_production_deploy is disabled."
+ end
+ nodes
+ end
+
end
end
bail! { log :missing, "platform directory '#{Path.platform}'" }
end
+ if LeapCli.leapfile.platform_branch && LeapCli::Util.is_git_directory?(Path.platform)
+ branch = LeapCli::Util.current_git_branch(Path.platform)
+ if branch != LeapCli.leapfile.platform_branch
+ bail! "Wrong branch for #{Path.platform}. Was '#{branch}', should be '#{LeapCli.leapfile.platform_branch}'. Edit Leapfile to disable this check."
+ end
+ end
+
#
# set log file
#
def vagrant_setup
assert_bin! 'vagrant', 'Vagrant is required for running local virtual machines. Run "sudo apt-get install vagrant".'
- unless `vagrant gem which sahara`.chars.any?
+ unless assert_run!('vagrant gem which sahara').chars.any?
log :installing, "vagrant plugin 'sahara'"
assert_run! 'vagrant gem install sahara'
end
#
def filter!(filters)
node_list = filter(filters)
- Util::assert! node_list.any?, "Could not match any nodes from '#{filters}'"
+ Util::assert! node_list.any?, "Could not match any nodes from '#{filters.join ' '}'"
return node_list
end
attr_accessor :leap_version
attr_accessor :log
attr_accessor :vagrant_network
+ attr_accessor :platform_branch
+ attr_accessor :allow_production_deploy
def initialize
@vagrant_network = '10.5.5.0/24'
if directory == '/'
return nil
else
- self.provider_directory_path = directory
+ @provider_directory_path = directory
read_settings(directory + '/Leapfile')
read_settings(ENV['HOME'] + '/.leaprc')
- self.platform_directory_path = File.expand_path(self.platform_directory_path || '../leap_platform', self.provider_directory_path)
+ @platform_directory_path = File.expand_path(@platform_directory_path || '../leap_platform', @provider_directory_path)
+ if @allow_production_deploy.nil?
+ # by default, only allow production deploys from 'master' or if not a git repo
+ @allow_production_deploy = !LeapCli::Util.is_git_directory?(@provider_directory_path) ||
+ LeapCli::Util.current_git_branch(@provider_directory_path) == 'master'
+ end
return true
end
end
#
def assert_run!(cmd, message=nil)
cmd = cmd + " 2>&1"
- output = `#{cmd}`
+ output = `#{cmd}`.strip
unless $?.success?
exit_status($?.exitstatus)
bail! do
ERB.new(string, nil, '%<>-').result(binding)
end
+ ##
+ ## GIT
+ ##
+
+ def is_git_directory?(dir)
+ Dir.chdir(dir) do
+ `which git && git rev-parse 2>/dev/null`
+ return $? == 0
+ end
+ end
+
+ def current_git_branch(dir)
+ Dir.chdir(dir) do
+ branch = `git symbolic-ref HEAD 2>/dev/null`.strip
+ if branch.chars.any?
+ branch.sub /^refs\/heads\//, ''
+ else
+ nil
+ end
+ end
+ end
+
end
end