Question

Disclaimer:. Je suis un noob à Rails et Capistrano (mais un développeur # .NET C intermédiaire) essayant d'en savoir plus

Je suis ont le temps le plus difficile d'obtenir un processus de développement Capistrano mis en place. voici ce que j'ai jusqu'à présent pour mon deploy.rb:


set :application, "MyAppName"
set :domain, "domainname"
set :user, "userid" 
set :repository,  "svn+ssh://#{user}@#{domain}/home/#{user}/svn/#{application}/trunk"
set :rails_env, :production
set :chmod755, %w(app config db lib public vendor script tmp public/dispatch.cgi public/dispatch.fcgi public/dispatch.rb)
set :deploy_to, "/home/#{user}/apps/#{application}"
set :use_sudo, false
set :deploy_via, :checkout
set :group_writable, false
default_run_options[:pty] = true
role :app, domain
role :web, domain
role :db,  domain, :primary => true

voici mon Capfile:


load 'deploy' if respond_to?(:namespace) # cap2 differentiator
Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
load 'config/deploy'

namespace :deploy do

  task :restart, :roles => :app do
    run "#{current_path}/script/process/reaper --dispatcher=dispatch.fcgi"
  end

  desc "Set the proper permissions for directories and files on HostingRails accounts"
  task :after_deploy do
    run(chmod755.collect do |item|
      "chmod 755 #{current_path}/#{item}"
    end.join(" && "))
  end

end
  1. Rails 2.3.2 n'a pas le répertoire script / processus pour la tâche de redémarrage ne fonctionne pas du tout. Comment puis-je résoudre ce problème?
  2. Est-il possible de définir la variable RAILS_ENV dans environment.rb à la "production" lorsque l'application est déployée ( "set: RAILS_ENV,: la production" ne le fait pas)
  3. ?
  4. Aussi, suis-je manque quelque chose d'autre de ces 2 fichiers?
Était-ce utile?

La solution

Voici mon deploy.rb, qui n'a pas vraiment été mis à jour depuis longtemps. Je lance deux commandes sed pour définir l'environnement dans ma: tâche after_update_code. Je suis certain qu'il ya un moyen plus facile de le faire, mais c'est ma méthode actuelle.

require 'erb'

before "deploy:setup", :db
after "deploy:update_code", "db:symlink" 
after "deploy", "deploy:cleanup"

def prompt_with_default(var, default)
  set(var) do
    Capistrano::CLI.ui.ask "Enter #{var} [#{default}] : "
  end

  set var, default if eval("#{var.to_s}.empty?")
end

default_run_options[:pty] = true 

set :rake, "/usr/local/bin/rake"

set :user, "your username"
set :application, "application name"
set :repository,  "svn repository path"
set :host, "domain name"
set :db_host, "DB host name"
set :db_user, "DB user name"
set :db_prefix, "any DB name prefix your host might require"
set :rails_env, "production"

set :deploy_to, "/home/username/rails/#{host}" # your deployment directory

role :app, host
role :web, host
role :db,  host, :primary => true

set :use_sudo, false
set :checkout, "export"

#
# TASKS
#
desc "Tasks to execute after code update"
task :after_update_code, :roles => [:app, :db, :web] do
  # Make sure we're running in production
  run "sed -i -e '/ENV.*RAILS_ENV/s/# //' #{release_path}/config/environment.rb"
  run "sed -i -e '/ENV.*RAILS_ENV/s/production/#{rails_env}/' #{release_path}/config/environment.rb"

  # Add banned IPs
  deny_lines = []
  File.readlines("#{release_path}/config/banned_ips").each {|ip|
    deny_lines << "deny from #{ip}"
  }

  ip_ban_block = <<EOBAN
# Bannination
order allow,deny
#{deny_lines.join}
allow from all
EOBAN

  run "sed -i -e 's/# BANNED IPS/#{ip_ban_block}/' #{release_path}/public/.htaccess"

  run "chmod +x #{release_path}/script/runner" 
  run "chmod +x #{release_path}/script/process/reaper" 
  run "chmod +x #{release_path}/script/process/spawner" 
  run "chmod 755 #{release_path}/public/dispatch.*" 
end

desc "Restarting after deployment"
task :after_deploy, :roles => [:app, :db, :web] do
  run "cd #{current_path} && rake RAILS_ENV=production db:sessions:clear tmp:clear"
  # fix permissions
  run "dos2unix #{release_path}/public/dispatch.*"
  run "dos2unix #{release_path}/public/.htaccess"
  run "chmod -R 755 #{release_path}"
  run "chmod -R 775 #{release_path}/log #{release_path}/tmp #{release_path}/script"
  run "find #{release_path}/ | xargs touch"
  run "touch #{deploy_to}/current/public/dispatch.fcgi"
end

desc "Restarting after rollback"
task :after_rollback, :roles => [:app, :db, :web] do
  run "touch #{deploy_to}/current/public/dispatch.fcgi"
end

namespace :db do
  desc "Create database yaml in shared path" 
  task :default do
  prompt_with_default(:db_password, "")
  db_config = ERB.new <<-EOF
base: &base
  adapter: mysql
  port: 3306
  host: #{db_host}
  username: #{db_user}
  password: #{db_password}

development:
  database: #{db_prefix}#{application}development
  <<: *base

test:
  database: #{db_prefix}#{application}test
  <<: *base

production:
  database: #{db_prefix}#{application}production
  <<: *base
EOF

    run "mkdir -p #{shared_path}/config" 
    put db_config.result, "#{shared_path}/config/database.yml" 
  end

  desc "Make symlink for database yaml" 
  task :symlink do
    run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml" 
  end
end

Une fois que je mis en place mes variables, j'ai un script bash qui fonctionne:

svn export $svn_path . --force
cap deploy

Ça va me demander mon mot de passe deux fois. Une fois pour l'exportation de SVN, et une fois une invite pour générer automatiquement mon database.yml dans le chemin partagé.

Autres conseils

Mise à jour ma réponse, voir # 3 ...

Je n'utilise FastCGI pour le déploiement, mais quelques petites choses qui viennent à l'esprit:

  1. Les scripts de traitement ont été déplacés sur des rails de base et en un plugin , que vous pouvez saisir de GitHub.
  2. En regardant mon fichier deploy.rb, vous aurez probablement besoin de passer la variable d'environnement RAILS_ENV dans le script par la ligne de commande, similaire à:

    run #{current_path}/script/process/reaper RAILS_ENV=#{rails_env} --dispatcher=dispatch.fcgi

  3. EDIT: En fait, il est un peu étrange d'avoir vos tâches dans le Capfile au lieu de deploy.rb - bien que regarder ce fil sur le groupe Google Capistrano , il est pas tout à fait mal vue. À vous / votre équipe, je suppose.

Espérons que cela vous fait dans la bonne direction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top