lib/railsmachine/recipes.rb in railsmachine-1.0.1 vs lib/railsmachine/recipes.rb in railsmachine-1.0.3

- old
+ new

@@ -1,83 +1,138 @@ -require 'railsmachine/recipes/svn' -require 'railsmachine/recipes/mysql' -require 'railsmachine/recipes/pgsql' -require 'railsmachine/recipes/apache' -require 'railsmachine/recipes/mongrel' - Capistrano::Configuration.instance(:must_exist).load do - + default_run_options[:pty] = true set :keep_releases, 3 set :app_symlinks, nil + set :scm, :subversion + set :httpd, :apache + set :app_server, :mongrel + set :db_adapter, :mysql + set :rails_env, "production" + + load 'config/deploy' + set :repository do + scm = fetch(:scm) + repos_base = "#{user}@#{domain}#{deploy_to}" + if scm.to_s == 'subversion' + "svn+ssh://#{repos_base}/repos/trunk" + elsif scm.to_s == 'git' + "ssh://#{repos_base}/repos/#{application}.git" + end + end + + + task :validate_required_variables do + validate_option(:scm, :in => [:subversion, :git]) + validate_option(:app_server, :in => [:mongrel, :passenger]) + validate_option(:httpd, :in => [:apache]) + validate_option(:db_adapter, :in => [:mysql, :postgresql, :sqlite3]) + end + + before :require_recipes, :validate_required_variables + + require "railsmachine/recipes/app/deploy" + require "railsmachine/recipes/app/mongrel" + require "railsmachine/recipes/app/passenger" + + # defer requires until variables have been set + task :require_recipes do + require "railsmachine/recipes/scm/#{scm}" + require "railsmachine/recipes/web/#{httpd}" + require "railsmachine/recipes/db/#{db_adapter}" + end + namespace :servers do desc <<-DESC A macro task that calls setup for db, app, symlinks, and web. Used to configure your deployment environment in one command. DESC task :setup do + sudo "chown -R #{user}:#{user} #{deploy_to.gsub(application,'')}" deploy.setup begin db.setup rescue puts "db:setup failed!" end app.setup web.setup end - desc "A macro task that restarts the application and web servers" + desc <<-DESC + A macro task that restarts the application and web servers + DESC task :restart do app.restart web.restart end end namespace :app do - desc 'Setup mongrel' + desc <<-DESC + Setup #{app_server} + DESC task :setup, :roles => :app do - set :mongrel_environment, rails_env - set :mongrel_port, apache_proxy_port - set :mongrel_servers, apache_proxy_servers - set :mongrel_user, user unless mongrel_user - set :mongrel_group, mongrel_user unless mongrel_group - set_mongrel_conf - mongrel.cluster.configure + case app_server.to_s + when "mongrel" + setup_mongrel + when "passenger" + # do nothing + end end - desc "Restart application server." + desc <<-DESC + Restart application server. + DESC task :restart, :roles => :app do - set_mongrel_conf - mongrel.cluster.restart + application_servlet.restart end - desc "Start application server." + desc <<-DESC + Start application server. + DESC task :start, :roles => :app do - set_mongrel_conf - mongrel.cluster.start + application_servlet.start end - desc "Stop application server." + desc <<-DESC + Stop application server. + DESC task :stop, :roles => :app do - set_mongrel_conf - mongrel.cluster.stop + application_servlet.stop end + + desc <<-DESC + Switch your application to run on mongrel or passenger. + DESC + task :switch do + case app_server.to_s + when "mongrel" + switch_to_mongrel + when "passenger" + switch_to_passenger + end + end namespace :symlinks do - desc "Setup application symlinks in the public" + desc <<-DESC + Setup application symlinks in the public + DESC task :setup, :roles => [:app, :web] do if app_symlinks app_symlinks.each { |link| run "mkdir -p #{shared_path}/public/#{link}" } end end - desc "Link public directories to shared location." + desc <<-DESC + Link public directories to shared location. + DESC task :update, :roles => [:app, :web] do if app_symlinks app_symlinks.each { |link| run "ln -nfs #{shared_path}/public/#{link} #{current_path}/public/#{link}" } end end @@ -86,76 +141,109 @@ end namespace :web do - desc "Setup web server." + desc <<-DESC + Setup web server. + DESC task :setup, :roles => :web do - set :apache_server_name, domain unless apache_server_name + set :apache_server_name, domain unless apache_server_name apache.configure end - desc "Restart web server." + desc <<-DESC + Restart web server. + DESC task :restart, :roles => :web do apache.restart end - desc "Reload web server configuration." + desc <<-DESC + Reload web server configuration. + DESC task :reload, :roles => :web do apache.reload end - desc "Start web server." + desc <<-DESC + Start web server. + DESC task :start, :roles => :web do apache.start end - desc "Stop web server." + desc <<-DESC + Stop web server. + DESC task :stop, :roles => :web do apache.stop end end - namespace :db do - - desc "Setup database server." - task :setup, :roles => :db, :only => { :primary => true } do - db_config = YAML.load_file('config/database.yml') - db_type = db_config[rails_env]["adapter"] - case db_config[rails_env]["adapter"] - when "mysql" - mysql.setup - when "postgresql" - postgresql.setup - else - puts "Only MySQL or Postgres can be configured by db:setup." - end - end - - end - namespace :repos do - - desc "Setup source control repository." + desc <<-DESC + Setup source control repository. + DESC task :setup, :roles => :scm do - begin - svn.setup + begin + sudo "chown -R #{user}:#{user} #{deploy_to.gsub(application,'')}" + localrepo.setup rescue - puts "svn:setup failed!" + puts "repos:setup failed!" end - svn.import - end + localrepo.import + end end - + on :start, :require_recipes before 'deploy:update_code', 'app:symlinks:setup' after 'deploy:symlink', 'app:symlinks:update' after 'deploy:cold', 'web:reload' after :deploy,'deploy:cleanup' - def set_mongrel_conf - set :mongrel_conf, "/etc/mongrel_cluster/#{application}.conf" unless mongrel_conf - end + def setup_mongrel + set_mongrel_conf + set :mongrel_environment, rails_env + set :mongrel_port, apache_proxy_port + set :mongrel_servers, apache_proxy_servers + set :mongrel_user, user unless mongrel_user + set :mongrel_group, mongrel_user unless mongrel_group + mongrel.cluster.configure + end + + def switch_to_mongrel + app.setup + app.start + web.setup + web.restart + end + + def switch_to_passenger + web.setup + mongrel.cluster.remove + web.restart + end + + def validate_option(key, options = {}) + if !(options[:in].map{|o| o.to_s } + ['']).include?(self[key].to_s) + raise(ArgumentError, error_msg("Invalid value '#{self[key]}' for option '#{key}' must be one of the following: '#{options[:in].join(', ')}'")) + end + end + + def application_servlet + case app_server.to_s + when 'mongrel' + mongrel.cluster + when 'passenger' + passenger + end + end + + def error_msg(msg) + banner = ''; msg.length.times { banner << "+" } + return "\n\n#{banner}\n#{msg}\n#{banner}\n\n" + end end