سؤال

تنصل:أنا مبتدئ في Rails وCapistrano (لكنني مطور متوسط ​​لـ .NET C#) وأحاول معرفة المزيد.

لقد واجهت أصعب الأوقات في إعداد عملية تطوير Capistrano.إليك ما لدي حتى الآن بخصوص موقعploy.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

هذا هو ملف 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 على دليل البرنامج النصي/العملية، لذا لا تعمل مهمة إعادة التشغيل على الإطلاق.كيف يمكنني حل هذه المشكلة؟
  2. هل هناك طريقة لتعيين متغير RAILS_ENV في بيئة.rb على "الإنتاج" عند نشر التطبيق ("set :rails_env, :production" لا يفعل ذلك)؟
  3. أيضًا، هل أفتقد أي شيء آخر من هذين الملفين؟
هل كانت مفيدة؟

المحلول

هذا هو موقعploy.rb الخاص بي، والذي لم يتم تحديثه حقًا منذ فترة طويلة.أقوم بتشغيل أمرين sed لتعيين البيئة داخل مهمتي: after_update_code.أنا متأكد من أن هناك طريقة أسهل للقيام بذلك، ولكن هذه هي طريقتي الحالية.

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

بمجرد إعداد المتغيرات الخاصة بي، لدي برنامج نصي bash يعمل:

svn export $svn_path . --force
cap deploy

سوف يطلب مني كلمة المرور الخاصة بي مرتين.مرة واحدة للتصدير من SVN، ومرة ​​واحدة كمطالبة لإنشاء قاعدة البيانات الخاصة بي تلقائيًا.yml في المسار المشترك.

نصائح أخرى

تحديث إجابتي، انظر رقم 3 ...

لا أستخدم FastCGI للنشر، ولكن هناك بعض الأشياء التي تتبادر إلى ذهني:

  1. تم نقل البرامج النصية للعملية من قلب Rails إلى البرنامج المساعد, ، والتي يمكنك الحصول عليها من GitHub.
  2. بالنظر إلى ملف Publish.rb الخاص بي، ستحتاج على الأرجح إلى تمرير متغير البيئة RAILS_ENV إلى البرنامج النصي من خلال سطر الأوامر، على غرار:

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

  3. يحرر:في الواقع، من الغريب بعض الشيء أن تكون مهامك في ملف Capfile بدلاً من Deploy.rb - على الرغم من النظر إلى هذا الموضوع على مجموعة جوجل Capistrano, ، إنه ليس مستهجنًا تمامًا.الأمر متروك لك/لفريقك، على ما أعتقد.

نأمل أن تكون هذه النقاط التي في الاتجاه الصحيح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top