From 79d2d64af91c15e44fdf40543ec03e2a034426ce Mon Sep 17 00:00:00 2001 From: Igor Rzegocki Date: Thu, 14 Apr 2016 14:34:03 +0200 Subject: [PATCH] Rails deploy hooks implemented --- attributes/default.rb | 11 +++++ libraries/drivers_base.rb | 20 ++++----- libraries/drivers_framework_base.rb | 21 ++++++++++ libraries/drivers_framework_factory.rb | 21 ++++++++++ libraries/drivers_framework_rails.rb | 14 +++++++ libraries/helpers.rb | 8 +++- recipes/deploy.rb | 56 +++++++++++++------------- 7 files changed, 112 insertions(+), 39 deletions(-) create mode 100644 libraries/drivers_framework_base.rb create mode 100644 libraries/drivers_framework_factory.rb create mode 100644 libraries/drivers_framework_rails.rb diff --git a/attributes/default.rb b/attributes/default.rb index 2ad97a84..053f49fc 100644 --- a/attributes/default.rb +++ b/attributes/default.rb @@ -20,3 +20,14 @@ default['defaults']['appserver']['tcp_nopush'] = false default['defaults']['appserver']['tries'] = 5 default['defaults']['appserver']['timeout'] = 60 + +# framework +## common + +default['defaults']['framework']['adapter'] = 'rails' + +## rails + +default['defaults']['framework']['migrate'] = true +default['defaults']['framework']['migration_command'] = + 'bundle exec rake db:version > /dev/null 2>&1 && bundle exec rake db:migrate || bundle exec rake db:setup' diff --git a/libraries/drivers_base.rb b/libraries/drivers_base.rb index 4369436f..699aba9e 100644 --- a/libraries/drivers_base.rb +++ b/libraries/drivers_base.rb @@ -19,16 +19,6 @@ def self.adapter(adapter = nil) (@adapter || self.class.name.underscore).to_s end - protected - - def allowed_engines - self.class.allowed_engines - end - - def adapter - self.class.adapter - end - # Dummy methods for children to redefine def setup(_context) end @@ -48,6 +38,16 @@ def undeploy(_context) def shutdown(_context) end + protected + + def allowed_engines + self.class.allowed_engines + end + + def adapter + self.class.adapter + end + def validate_app_engine return validate_node_engine if app_engine.blank? validate_engine(:app) diff --git a/libraries/drivers_framework_base.rb b/libraries/drivers_framework_base.rb new file mode 100644 index 00000000..1a9a1a11 --- /dev/null +++ b/libraries/drivers_framework_base.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +module Drivers + module Framework + class Base < Drivers::Base + include Drivers::Dsl::Output + + def out + handle_output(raw_out) + end + + def raw_out + node['defaults']['framework'].merge( + node['deploy'][app['shortname']]['framework'] || {} + ).symbolize_keys + end + + def validate_app_engine + end + end + end +end diff --git a/libraries/drivers_framework_factory.rb b/libraries/drivers_framework_factory.rb new file mode 100644 index 00000000..7a2fd439 --- /dev/null +++ b/libraries/drivers_framework_factory.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true +module Drivers + module Framework + class Factory + def self.build(app, node, options = {}) + engine = detect_engine(app, node, options) + raise StandardError, 'There is no supported Framework driver for given configuration.' if engine.blank? + engine.new(app, node, options) + end + + def self.detect_engine(app, node, _options) + Drivers::Framework::Base.descendants.detect do |framework_driver| + framework_driver.allowed_engines.include?( + node['deploy'][app['shortname']]['framework'].try(:[], 'adapter') || + node['defaults']['framework']['adapter'] + ) + end + end + end + end +end diff --git a/libraries/drivers_framework_rails.rb b/libraries/drivers_framework_rails.rb new file mode 100644 index 00000000..e30783a9 --- /dev/null +++ b/libraries/drivers_framework_rails.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +module Drivers + module Framework + class Rails < Drivers::Framework::Base + adapter :rails + allowed_engines :rails + output filter: [:migrate, :migration_command, :deploy_environment] + + def raw_out + super.merge(deploy_environment: { 'RAILS_ENV' => 'production' }) + end + end + end +end diff --git a/libraries/helpers.rb b/libraries/helpers.rb index 01a3cb38..f57e9f7e 100644 --- a/libraries/helpers.rb +++ b/libraries/helpers.rb @@ -39,7 +39,6 @@ def every_enabled_application node['deploy'].each do |deploy_app_shortname, deploy| application = applications.detect { |app| app['shortname'] == deploy_app_shortname } next unless application - deploy = deploy[application['shortname']] yield application, deploy end end @@ -49,3 +48,10 @@ def every_enabled_rds yield rds end end + +def perform_bundle_install(release_path) + bundle_install File.join(release_path, 'Gemfile') do + deployment true + without %w(development test) + end +end diff --git a/recipes/deploy.rb b/recipes/deploy.rb index dc820740..b05cf783 100644 --- a/recipes/deploy.rb +++ b/recipes/deploy.rb @@ -1,17 +1,26 @@ # frozen_string_literal: true include_recipe 'opsworks_ruby::configure' -do_migrate = true - -every_enabled_application do |app, _deploy| +every_enabled_application do |app, deploy| scm = Drivers::Scm::Factory.build(app, node) - scm.before_deploy(self) appserver = Drivers::Appserver::Factory.build(app, node) + framework = Drivers::Framework::Factory.build(app, node) + + scm.before_deploy(self) + appserver.before_deploy(self) + framework.before_deploy(self) deploy app['shortname'] do deploy_to deploy_dir(app) user node['deployer']['user'] || 'root' group www_group + environment framework.out[:deploy_environment] + + create_dirs_before_symlink deploy[:create_dirs_before_symlink] + keep_releases deploy[:keep_releases] + purge_before_symlink deploy[:purge_before_symlink] if deploy[:purge_before_symlink] + symlink_before_migrate deploy[:symlink_before_migrate] + symlinks deploy[:symlinks] if deploy[:symlinks] scm.out.each do |scm_key, scm_value| send(scm_key, scm_value) @@ -23,40 +32,31 @@ config[:timer] end - migration_command( - 'bundle exec rake db:version > /dev/null 2>&1 && bundle exec rake db:migrate || bundle exec rake db:setup' - ) - migrate do_migrate + migration_command(framework.out[:migration_command]) + migrate framework.out[:migrate] before_migrate do - bundle_install File.join(release_path, 'Gemfile') do - deployment true - without %w(development test) - end + perform_bundle_install(release_path) run_callback_from_file(File.join(release_path, 'deploy', 'before_migrate.rb')) end before_symlink do - bundle_install File.join(release_path, 'Gemfile') do - deployment true - without %w(development test) - end unless do_migrate + perform_bundle_install(release_path) unless framework.out[:migrate] run_callback_from_file(File.join(release_path, 'deploy', 'before_symlink.rb')) end + + before_restart do + directory File.join(release_path, '.git') do + recursive true + action :delete + end + + run_callback_from_file(File.join(release_path, 'deploy', 'before_restart.rb')) + end end + framework.after_deploy(self) + appserver.after_deploy(self) scm.after_deploy(self) end - -# every_enabled_app do |app, deploy| -# deploy app['shortname'] do -# deploy_to deploy_dir -# environment app['environment'] || {} -# group www_group -# migrate false -# repository app['app_source']['url'] -# rollback_on_error true -# user node['deployer']['user'] -# end -# end