class CapistranoMulticonfigParallel::JobCommand
class used to find application dependencies
Attributes
job[R]
job_capistrano_version[R]
job_final_capfile[R]
job_final_gemfile[R]
legacy_capistrano[R]
tempfile[R]
Public Class Methods
new(job)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 13 def initialize(job) @job = job @job_final_gemfile = job_gemfile_multi end
Public Instance Methods
bash_bin_path()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 171 def bash_bin_path @bash_bin_path ||= `which bash` end
bundle_gemfile_env(gemfile = job_gemfile)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 70 def bundle_gemfile_env(gemfile = job_gemfile) "BUNDLE_GEMFILE=#{gemfile}" end
capfile_name()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 41 def capfile_name find_capfile.present? ? find_capfile.basename : nil end
capistrano_action()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 105 def capistrano_action argv = task_arguments.present? ? "[#{task_arguments}]" : '' "#{action}#{argv}" end
capistrano_sentinel_available?()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 84 def capistrano_sentinel_available? gitflow_version = job_gem_version(capistrano_sentinel_name) gitflow_version.present? ? true : false end
capistrano_sentinel_name()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 80 def capistrano_sentinel_name "capistrano_sentinel" end
capistrano_sentinel_needs_updating?()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 145 def capistrano_sentinel_needs_updating? if capistrano_sentinel_available? loaded_capistrano_sentinel_version == job_capistrano_sentinel_version else # the capistrano_sentinel is not part of the Gemfile so no need checking if needs updating true end end
check_capistrano_sentinel_availability()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 285 def check_capistrano_sentinel_availability # '#{find_loaded_gem_property(capistrano_sentinel_name)}' # path: '/home/raul/workspace/github/capistrano_sentinel' if capistrano_sentinel_available? @job_final_gemfile = job_gemfile else FileUtils.rm_rf(job_gemfile_multi) if File.exists?(job_gemfile_multi) FileUtils.touch(job_gemfile_multi) File.open(job_gemfile_multi, 'w') do |f| cmd=<<-CMD source "https://rubygems.org" do gem "#{capistrano_sentinel_name}", '#{find_loaded_gem_property(capistrano_sentinel_name)}' end instance_eval(File.read(File.dirname(__FILE__) + "/Gemfile")) CMD f.write(cmd) end FileUtils.copy(job_gemfile_lock, "#{job_gemfile_multi}.lock") end end
check_rvm_loaded()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 202 def check_rvm_loaded return "cd #{job_path}" unless rvm_enabled_for_job? "source #{rvm_scripts_path} && rvm rvmrc trust #{job_path} && cd #{job_path} && source #{job_rvmrc_file}" end
create_job_tempfile_command(output)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 179 def create_job_tempfile_command(output) @tempfile = Tempfile.new(["multi_cap_#{job.id}_command_", ".rb"], encoding: 'utf-8') @tempfile.write(output) ObjectSpace.undefine_finalizer(@tempfile) # force garbage collector not to remove automatically the file @tempfile.close end
env_option_filtered?(key, filtered_keys_array = [])
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 110 def env_option_filtered?(key, filtered_keys_array = []) filtered_env_keys.include?(env_key_format(key)) || filtered_keys_array.include?(key.to_s) end
execute_standard_deploy(action = nil)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 338 def execute_standard_deploy(action = nil) run_shell_command(fetch_deploy_command) rescue => ex rescue_error(ex, 'stderr') execute_standard_deploy('deploy:rollback') if action.blank? && @name == 'deploy' end
fetch_bundler_check_command(gemfile = job_gemfile)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 26 def fetch_bundler_check_command(gemfile = job_gemfile) "#{check_rvm_loaded} && if [ `which bundler |wc -l` = 0 ]; then gem install bundler;fi && (#{bundle_gemfile_env(gemfile)} bundle check || #{bundle_gemfile_env(gemfile)} bundle install )" end
fetch_bundler_worker_command()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 30 def fetch_bundler_worker_command get_command_script(fetch_bundler_check_command, "bundler") end
fetch_deploy_command()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 244 def fetch_deploy_command prepare_application_for_deployment # config_flags = CapistranoMulticonfigParallel.configuration_flags.merge("capistrano_version": job_capistrano_version) environment_options = setup_command_line.join(' ') command = "#{fetch_bundler_check_command(@job_final_gemfile)} && WS_PORT=#{CelluloidPubsub::WebServer.find_unused_port} WEBSOCKET_LOGGING=#{debug_websocket?} LOG_FILE=#{websocket_config.fetch('log_file_path', nil)} #{bundle_gemfile_env(@job_final_gemfile)} bundle exec cap #{job_stage} #{capistrano_action} #{environment_options}" if @job_final_capfile != job_capfile command += " -f #{@job_final_capfile}" end get_command_script(command) end
filtered_env_keys()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 66 def filtered_env_keys %w(STAGES ACTION) end
find_capfile(custom_path = job_path)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 35 def find_capfile(custom_path = job_path) @capfile_path ||= find_file_by_names(custom_path, 'capfile').first raise "Please make sure you have a Capfile in the project root directory #{custom_path}".red if @capfile_path.blank? @capfile_path end
gem_specs()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 45 def gem_specs @specs = lockfile_parser.specs end
get_command_script(command, action = nil)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 219 def get_command_script(command, action = nil) command = rvm_bash_prefix(command) command = command.inspect command_text =<<-CMD require 'rubygems' require 'bundler' Bundler.with_clean_env { Kernel.exec(#{command}) } CMD if rvm_enabled_for_job? create_job_tempfile_command(command_text) log_to_worker("JOB #{@job_id} created Tempfile #{@tempfile.path} with contents #{File.read(@tempfile.path)}", action) "ruby #{@tempfile.path}" else final_command=<<-CMD cd #{job_path} && bundle exec ruby -e "#{command_text}" CMD log_to_worker("JOB #{@job_id} prepared command #{final_command}", action) final_command end end
gitflow_enabled?()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 75 def gitflow_enabled? gitflow_version = job_gem_version("capistrano-gitflow") gitflow_version.present? ? true : false end
job_capfile()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 258 def job_capfile File.join(job_path, capfile_name.to_s) end
job_capfile_multi()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 262 def job_capfile_multi "#{job_capfile}.multi_cap" end
job_capistrano_sentinel_version()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 93 def job_capistrano_sentinel_version job_gem_version(capistrano_sentinel_name) end
job_gem_version(gem_name)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 61 def job_gem_version(gem_name) gem_spec = gem_specs.find {|spec| spec.name == gem_name} gem_spec.present? ? gem_spec.version.to_s : nil end
job_gemfile()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 49 def job_gemfile @job_gemfile ||=File.join(job_path, 'Gemfile') raise "Please make sure you have a Gemfile in the project root directory #{job_path}".red unless File.exists?(@job_gemfile) @job_gemfile end
job_gemfile_lock()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 55 def job_gemfile_lock @job_gemfile_lock ||= "#{job_gemfile}.lock" raise "Please make sure you have a Gemfile.lock in the project root directory #{job_path}".red unless File.exists?(@job_gemfile_lock) @job_gemfile_lock end
job_gemfile_multi()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 266 def job_gemfile_multi File.join(job_path, "Gemfile.multi_cap") end
job_path()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 154 def job_path if path.present? && File.directory?(path) && find_capfile(path).present? path else detect_root end end
job_rvmrc_enabled?()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 194 def job_rvmrc_enabled? File.exists?(job_rvmrc_file) end
job_rvmrc_file()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 190 def job_rvmrc_file File.join(job_path, '.rvmrc') end
job_stage()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 101 def job_stage app.present? && application_supports_multi_apps?(job_path) ? "#{app}:#{stage}" : "#{stage}" end
job_stage_for_terminal()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 97 def job_stage_for_terminal app.present? ? "#{app}:#{stage}" : "#{stage}" end
legacy_capistrano_version?()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 137 def legacy_capistrano_version? verify_gem_version(job_capistrano_version, '3.0', operator: '<') end
loaded_capistrano_sentinel_version()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 89 def loaded_capistrano_sentinel_version find_loaded_gem_property(capistrano_sentinel_name) end
lockfile_parser()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 18 def lockfile_parser if File.exists?(job_gemfile) && File.exists?(job_gemfile_lock) @lockfile_parser ||= Bundler::LockfileParser.new(Bundler.read_file("#{job_gemfile_lock}")) else raise "please install the gems separately for this application #{job_path} and re-try again!" end end
log_to_worker(message, action = nil)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 211 def log_to_worker(message, action = nil) if action.present? || action.to_s == id.to_s log_to_file(message, job_id: id, prefix: action) else log_to_file(message) end end
prepare_application_for_deployment()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 270 def prepare_application_for_deployment unless capistrano_sentinel_needs_updating? raise "Please consider upgrading the gem #{capistrano_sentinel_name} to version #{loaded_capistrano_sentinel_version} from #{job_capistrano_sentinel_version} in #{job_path} " end config = @job.application.patched_job_paths.find{|hash| hash[:path] == job_path} if config.present? @job_final_gemfile = config[:gemfile] @job_final_capfile = config[:capfile] else check_capistrano_sentinel_availability prepare_capfile @job.application.patched_job_paths << {path: job_path, gemfile: @job_final_gemfile, capfile: @job_final_capfile} end end
prepare_capfile()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 306 def prepare_capfile capfile_valid = File.foreach(job_capfile).grep(/#{capistrano_sentinel_name}/).any? if capistrano_sentinel_available? && capfile_valid.present? @job_final_capfile = job_capfile elsif capfile_valid.blank? && capistrano_sentinel_available? @job_final_capfile = job_capfile File.open(job_capfile, 'a+') do |f| cmd=<<-CMD require "#{capistrano_sentinel_name}" CMD f.write(cmd) end elsif capistrano_sentinel_available? == false @job_final_capfile = job_capfile_multi FileUtils.copy(job_capfile, job_capfile_multi) File.open(job_capfile_multi, 'a+') do |f| cmd=<<-CMD require "#{capistrano_sentinel_name}" CMD f.write(cmd) end end end
rollback_changes_to_application()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 331 def rollback_changes_to_application FileUtils.rm_rf(job_gemfile_multi) if File.exists?(job_gemfile_multi) FileUtils.rm_rf("#{job_gemfile_multi}.lock") if File.exists?("#{job_gemfile_multi}.lock") FileUtils.rm_rf(job_capfile_multi) if File.exists?(job_capfile_multi) FileUtils.rm_rf(@tempfile.path) if defined?(@tempfile) && @tempfile end
rvm_bash_prefix(command)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 207 def rvm_bash_prefix(command) rvm_enabled_for_job? ? "bash --login -c '#{command}'" : command end
rvm_bin_path()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 167 def rvm_bin_path @rvm_path ||= `which rvm` end
rvm_enabled_for_job?()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 198 def rvm_enabled_for_job? job_rvmrc_enabled? && rvm_installed? && bash_bin_path.present? end
rvm_installed?()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 175 def rvm_installed? rvm_bin_path.present? end
rvm_scripts_path()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 186 def rvm_scripts_path File.join(File.dirname(File.dirname(rvm_bin_path)), 'scripts', 'rvm') end
setup_command_line(*args)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 128 def setup_command_line(*args) new_arguments, options = setup_command_line_standard(*args) setup_env_options(options).concat(new_arguments) end
setup_env_options(options = {})
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 114 def setup_env_options(options = {}) array_options = [] filtered_keys = options.delete(:filtered_keys) || [] env_options.each do |key, value| array_options << "#{env_prefix(key, legacy_capistrano)} #{env_key_format(key, legacy_capistrano)}=#{value}" if value.present? && !env_option_filtered?(key, filtered_keys) end setup_remaining_flags(array_options, options) end
setup_remaining_flags(array_options, options)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 123 def setup_remaining_flags(array_options, options) array_options << trace_flag(legacy_capistrano) if app_debug_enabled? array_options.concat(setup_flags_for_job(options)) end
user_home_directory()
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 162 def user_home_directory user = Etc.getlogin Dir.home(user) end
Private Instance Methods
run_shell_command(command)
click to toggle source
# File lib/capistrano_multiconfig_parallel/classes/job_command.rb, line 347 def run_shell_command(command) Kernel.system("#{command}") end