2013-12-16 6 views
8

पर मैं अपने रेल ऐप के प्रारंभिक तैनाती पर db:migrate के स्थान पर db:schema:load चलाऊंगा। के रूप में in this stack overflow question देखास्कीमा कैसे चलाएं: प्रारंभिक कैपिस्ट्रानो 3 पर लोड करें मेरे रेल ऐप

यह काफी तुच्छ हुआ करता था, लेकिन Capistrano 3 में, वे deploy:cold कार्य का बहिष्कार कर दिया है। प्रारंभिक तैनाती सभी बाद के तैनाती से अलग नहीं है।

कोई सुझाव? धन्यवाद!

उत्तर

2

आप के रूप में मूल रूप से सामान्य तैनाती कार्य का डुप्लिकेट deploy:cold परिभाषित करने के लिए, लेकिन deploy:db_load_schema बजाय deploy:migrations साथ होगा। उदाहरण के लिए:

desc 'Deploy app for first time' 
task :cold do 
    invoke 'deploy:starting' 
    invoke 'deploy:started' 
    invoke 'deploy:updating' 
    invoke 'bundler:install' 
    invoke 'deploy:db_load_schema' # This replaces deploy:migrations 
    invoke 'deploy:compile_assets' 
    invoke 'deploy:normalize_assets' 
    invoke 'deploy:publishing' 
    invoke 'deploy:published' 
    invoke 'deploy:finishing' 
    invoke 'deploy:finished' 
end 

desc 'Setup database' 
task :db_load_schema do 
    on roles(:db) do 
    within release_path do 
     with rails_env: (fetch(:rails_env) || fetch(:stage)) do 
     execute :rake, 'db:schema:load' 
     end 
    end 
    end 
end 

यह और भी बेहतर हो सकता है deploy:db_schema_load कार्य स्वतंत्र रूप से चलाने के लिए, के रूप में कार्य डिफ़ॉल्ट deploy में शामिल समय के साथ बदल सकता है।

मैं वास्तव में ताजा तैनात के लिए db:setup का उपयोग कर, क्योंकि बनाने तालिकाओं के बाद यह बीज डेटाबेस:

desc 'Setup database' 
task :db_setup do 
    ... 
     execute :rake, 'db:setup' 
    ... 
end 
+0

सुझाव के लिए धन्यवाद; यह मुझे अपनी खुद की वृत्ति के साथ और अधिक आरामदायक बना देता है जो तैनाती को पुनर्जीवित करता है: ठंडा जाने का रास्ता था। मैंने अपना खुद का संस्करण नीचे दिया है। – odigity

2

मैं, भी, Capistrano के लिए नया हूँ, और पहली बार के लिए इसका इस्तेमाल करने के लिए एक रेल एप्लिकेशन को तैनात करने की कोशिश कर रहा मैं उत्पादन सर्वर के लिए मैं कठपुतली के साथ कॉन्फ़िगर किया।

मैं अंत में Capistrano स्रोत (और Capistrano/बंडलर, और Capistrano/रेल, और यहां तक ​​कि sshkit और नेट ssh डिबग प्रमाणन समस्याओं का) में खुदाई करने के लिए निर्धारित करने के लिए वास्तव में कैसे सब कुछ काम करता है इससे पहले कि मैं खुद के लिए निर्णय लेने से विश्वासपात्र महसूस किया था क्या परिवर्तन मैं बनाना चाहता था। मैं तो बस उन परिवर्तनों को करने तैयार कर लिया और मैं परिणामों के साथ खुश हूँ:

# lib/capistrano/tasks/cold.rake 
namespace :deploy do 

    desc "deploy app for the first time (expects pre-created but empty DB)" 
    task :cold do 
    before 'deploy:migrate', 'deploy:initdb' 
    invoke 'deploy' 
    end 

    desc "initialize a brand-new database (db:schema:load, db:seed)" 
    task :initdb do 
    on primary :web do |host| 
     within release_path do 
     if test(:psql, 'portal_production -c "SELECT table_name FROM information_schema.tables WHERE table_schema=\'public\' AND table_type=\'BASE TABLE\';"|grep schema_migrations') 
      puts '*** THE PRODUCTION DATABASE IS ALREADY INITIALIZED, YOU IDIOT! ***' 
     else 
      execute :rake, 'db:schema:load' 
      execute :rake, 'db:seed' 
     end 
     end 
    end 
    end 

end 

तैनाती: ठंड कार्य केवल अपने कस्टम तैनाती हुक: inidb तैनाती से पहले चलाने के लिए कार्य: विस्थापित होती है। इस तरह स्कीमा और बीज लोड हो जाते हैं, और तैनाती: निम्नानुसार कदम माइग्रेट करता है (सुरक्षित रूप से) क्योंकि चलाने के लिए कोई नया माइग्रेशन नहीं है। सुरक्षा के रूप में, मैं यह देखने के लिए परीक्षण करता हूं कि स्कीमा लोड करने से पहले schema_migrations तालिका पहले से मौजूद है या नहीं, यदि आप तैनात करते हैं: फिर ठंडा करें।

नोट: मैं कठपुतली का उपयोग कर डीबी बनाना चुनता हूं, इसलिए मैं अपने उत्पादन postgresql उपयोगकर्ता को CREATEDB विशेषाधिकार प्रदान करने से बच सकता हूं, लेकिन यदि आप Capistrano को ऐसा करना चाहते हैं, तो बस "execute: rake, 'db: create '' डीबी से पहले: स्कीमा: लोड करें, या 'डीबी: सेटअप' के साथ सभी तीन लाइनों को प्रतिस्थापित करें।

+0

मुझे नहीं पता कि उन्होंने तैनात क्यों हटाया: कैपिस्ट्रानो 3 में ठंडा - यह अभी भी मेरे लिए सही दृष्टिकोण जैसा लगता है। लेकिन मुझे खुशी है कि उसने मुझे अपनी जरूरतों के लिए अपना खुद का संस्करण कस्टम बनाने में धक्का दिया, और मुझे खुशी है कि अब मैं सिस्टम के आंतरिक कार्यों को समझता हूं और साथ ही करता हूं। – odigity

+0

'portal_production' क्या है? –

+0

मेरे उत्पादन डेटाबेस का नाम। – odigity

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