2012-03-13 17 views
8

जब मैं Capistrano के साथ अपने एप्लिकेशन को तैनात करने की कोशिश, मैं इस त्रुटि मिलेगी:Capistrano - मेरी database.yml को तैनात नहीं कर सकते

failed: "sh -c 'cp /var/www/my_app/releases/20120313115055/config/database.staging.yml /var/www/my_app/releases/20120313115055/config/database.yml'" on IP_ADDR

मेरे database.yml यानी खाली, database.staging .yml:

production: 
    adapter: mysql2 
    encoding: utf8 
    reconnect: false 
    database: my_db 
    pool: 15 
    username: my_user_name 
    password: my_pass 
    host: localhost 
/confing में

/तैनात फ़ाइलें "उत्पादन" "मचान रहे हैं"

मुझे यहां क्या याद आ रहा है/मुझे विफलता की तलाश क्यों करनी चाहिए? सर्वर पर डेटाबेस के लिए प्रमाण पत्र सही होना चाहिए।

cp: cannot stat `/var/www/my_app/releases/20120313144907/config/database.staging.yml': No such file or directory 
+0

क्या होता है जब आप उस मशीन पर मैन्युअल रूप से cp कमांड चलाते हैं? –

+1

.yml या .ymp? यदि आपके पास .mp है, तो आपकी फ़ाइल को गलत नाम दिया गया है – DGM

+0

.yml, मेरा बुरा ... – user984621

उत्तर

21

मैं कैसे अपनी समस्या को हल करने के लिए यकीन नहीं है: -

संपादित यहाँ मेरी तैनाती

set :application, "my_app" 
set :repository, "https://IP_ADDR/svn/my_app" 

set :scm, :subversion 
set :scm_username, 'my_name' 
set :scm_password, 'my_pass' 

default_run_options[:pty] = true 

set :user, "my_name" 
set :domain, 'IP_ADDR' 

set :deploy_to, "/var/www/my_app" 

set :use_sudo, false 
set :deploy_via, :remote_cache 
#set :keep_releases, 1 

set :rails_env, 'production' 

role :web, domain 
role :app, domain 
role :db, domain, :primary => true # This is where Rails migrations will run 

namespace :deploy do 

    task :build_gems, :roles => :app do 
     desc "Building gems" 
     run "cd #{release_path} && bundle install --deployment" 
    end 

    task :migrations do 
     desc "Migrating database" 
     run "cd #{release_path} && rake db:migrate RAILS_ENV=production" 
    end 

    [:start, :stop].each do |t| 
     desc "#{t} task is a no-op with passenger" 
     task t, :roles => :app do ; end 
    end 

    desc "Restarting passenger with restart.txt" 
    task :restart, :roles => :app, :except => { :no_release => true } do 
     run "touch #{release_path}/tmp/restart.txt" 
    end 

    after "deploy:update_code", "deploy:build_gems", "db:copy_configuration", "config:copy", "deploy:migrations", "deploy:cleanup" 
    after "deploy:update", "bluepill:copy_config", "bluepill:restart" 
end 

namespace :db do 
    task :copy_configuration do 
     run "cp #{release_path}/config/database.staging.yml #{release_path}/config/database.yml" 
    end 
end 

namespace :config do 
    task :copy do 
     run "cp #{release_path}/config/config.staging.yml #{release_path}/config/config.yml" 
    end 
end 

namespace :bluepill do 
    desc "Restart bluepill process" 
    task :restart, :roles => [:app] do 
    run "#{release_path}/script/delayed_job stop" 
    sudo "/etc/init.d/bluepill.sh restart" 
    end 

    #desc "Load bluepill configuration and start it" 
    ##task :start, :roles => [:app] do 
    # sudo "/etc/init.d/bluepill.sh start" 
    #end 

    desc "Prints bluepills monitored processes statuses" 
    task :status, :roles => [:app] do 
    sudo "bluepill status" 
    end 

    desc "Copy config" 
    task :copy_config, :roles => [:app] do 
    run "cp #{release_path}/config/bluepill/configuration.rb /srv/script/bluepill.rb" 
    end 
end 

समस्या है। ऐसा लगता है कि डेटाबेस.स्टेजिंग.आईएमएल तैनात नहीं किया जा रहा है, इसलिए इसकी प्रतिलिपि बनाने के लिए कुछ भी नहीं है।

मुझे लगता है कि एक बेहतर वर्कफ़्लो है, हालांकि। सेटिंग्स और डेटाबेस कॉन्फ़िगरेशन जैसी चीजें आम तौर पर तैनाती के बीच नहीं बदलती हैं, इसलिए ये चीजें सभी कैपिस्ट्रानो रिलीज़ के साझा फ़ोल्डर में जा सकती हैं। आम तौर पर, आप अपने डेटाबेस में अपने डेटाबेस में होना चाहते हैं या तो संवेदनशील जानकारी के बाद से। आप अपने .gitignore में config/database.yml को छोड़कर इन दोनों चीजों को संतुष्ट कर सकते हैं।

यह आपको अपने सर्वर पर एक बार सेट अप करने की आवश्यकता है। आपको your_app_path/shared/config पर database.yml बनाने की आवश्यकता है। साझा वर्तमान और रिलीज के लिए एक भाई है।

आपका deploy.rb एक ऐसा कार्य होना चाहिए जो साझा की गई निर्देशिका में नए तैनात रिलीज के database.yml पर सिमलिंक हो। इस तरह:

before "deploy:assets:precompile" do 
    run ["ln -nfs #{shared_path}/config/settings.yml #{release_path}/config/settings.yml", 
     "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml", 
     "ln -fs #{shared_path}/uploads #{release_path}/uploads" 
    ].join(" && ") 
end 

इसका मतलब यह है कि आपके रेपो कोई database.yml फ़ाइलें शामिल होंगी। चूंकि वे शायद आपके रेपो में पहले से ही हैं। आपको git rm करना होगा, प्रतिबद्ध करें। उन्हें .gitignore में जोड़ें और इसे प्रतिबद्ध करें।

+1

अपडेट किया है, हमने यह किया है, लेकिन config.ml.example में कॉन्फ़िगरेशन शामिल है, जो डेवलपर डेटाबेस पर अनुमान लगाने के बिना स्थानीय रूप से जाने के लिए उपयोग कर सकते हैं। एमआईएल सेटिंग्स – tehfoo

+0

मुझे लगता है कि वर्तमान/config/database.yml है साझा/config/database.yml से जुड़ा हुआ अगर साझा/config/database.yml गुम है तो यह आपको 'ऐसी कोई फ़ाइल या निर्देशिका' नहीं देगा। हम इसे मैन्युअल रूप से साझा/config/database.yml में बना सकते हैं और इसे तैनात कर सकते हैं। यह सामान यहाँ काम करता है। – vajapravin

+0

क्षमा करें, आपकी 'deploy.rb' स्क्रिप्ट 'settings.yml' का उल्लेख क्यों करती है? – Matthias

8

Capistrano 3 में में false को config.assets.initialize_on_precompile स्थापित करने के साथ ठीक हो सकता है आप precompile तो दौरान "संदर्भ आवेदन वस्तुओं या तरीकों" (1) की जरूरत नहीं है, तो फ़ाइलें है जोड़ने में निर्मित। जॉन के जवाब बस है:

  • shared/ फ़ोल्डर में config/database.yml
  • बनाने config/deploy.rb उपयोग में इस लाइन

    set :linked_files, fetch(:linked_files, []).push('config/database.yml') 
    

यह है जॉन क्या कह रहा था।

+0

यह है। धन्यवाद – Francisco

+0

हम इसे नवीनतम संस्करण, 3.8.0 के लिए कैसे हल कर सकते हैं? –

संबंधित मुद्दे