Skip to content
This repository has been archived by the owner on Dec 31, 2022. It is now read-only.

Commit

Permalink
Rails deploy hooks implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
Igor Rzegocki committed Apr 14, 2016
1 parent 2e9947b commit 79d2d64
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 39 deletions.
11 changes: 11 additions & 0 deletions attributes/default.rb
Expand Up @@ -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'
20 changes: 10 additions & 10 deletions libraries/drivers_base.rb
Expand Up @@ -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
Expand All @@ -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)
Expand Down
21 changes: 21 additions & 0 deletions 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
21 changes: 21 additions & 0 deletions 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
14 changes: 14 additions & 0 deletions 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
8 changes: 7 additions & 1 deletion libraries/helpers.rb
Expand Up @@ -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
Expand All @@ -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
56 changes: 28 additions & 28 deletions 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)
Expand All @@ -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

0 comments on commit 79d2d64

Please sign in to comment.