2013-10-25 15 views
15

Kiedy zacznęCapistrano 3, Szyny 4, konfiguracja bazy danych nie określa adapter

produkcja czapka wdrożyć

to nie tak:

DEBUG [4ee8fa7a] Command: cd /home/deploy/myapp/releases/releases/20131025212110 && (RVM_BIN_PATH=~/.rvm/bin RAILS_ENV= ~/.rvm/bin/myapp_rake assets:precompile) 
DEBUG [4ee8fa7a]  rake aborted! 
DEBUG [4ee8fa7a]  database configuration does not specify adapter 

Widać, że " RAILS_ENV = "jest rzeczywiście pusty i zastanawiam się, dlaczego tak się dzieje? Zakładam, że to jest powód tego ostatniego błędu, że nie mam konfiguracji bazy danych.

Plik deploy.rb jest poniżej:

set :application, 'myapp' 
set :repo_url, '[email protected]:developer/myapp.git' 
set :branch, :master 
set :deploy_to, '/home/deploy/myapp/releases' 
set :scm, :git 
set :devpath, "/home/deploy/myapp_development" 
set :user, "deploy" 
set :use_sudo, false 
set :default_env, { rvm_bin_path: '~/.rvm/bin' } 

set :keep_releases, 5 

namespace :deploy do 
    desc 'Restart application' 
    task :restart do 
    on roles(:app), in: :sequence, wait: 5 do 
     # Your restart mechanism here, for example: 
     within release_path do 
     execute " bundle exec thin restart -O -C config/thin/production.yml" 
     end 
    end 
    end 

    after :restart, :clear_cache do 
    on roles(:web), in: :groups, limit: 3, wait: 10 do 
     within release_path do 

     end 
    end 
    end 

    after :finishing, 'deploy:cleanup' 
end 

database.yml:

production: 
    adapter: mysql2 
    encoding: utf8 
    database: myapp_production 
    pool: 5 
    username: user 
    password: pass 
    host: localhost 

development: 
    adapter: mysql2 
    encoding: utf8 
    database: myapp_development 
    pool: 5 
    username: user 
    password: pass 
    host: localhost 

Problem został rozwiązany, jeśli dodam

set :rails_env, "production" 

do mojego deploy.rb, ale wygląda na to, że jest to hardcoding i jestem pewna, że ​​jest lepsze rozwiązanie.

+0

Czy możesz opublikować swój 'database.yml'? Powinien zawierać sekcję "produkcji" z adapterem bazy danych. –

+0

Dodałem go do opisu. – Kazmin

+0

Proponuję dwukrotnie sprawdzić w twoim 'Gemfile', jeśli deklaracja dla' gem "mysql2" 'znajduje się wewnątrz' group: production do ... end'. –

Odpowiedz

17

EDIT: Per this pull request, to teraz poprawione w wersji 1.1.0 z capistrano-rails.

Na this Github issue, kolejną poprawką jest edycja Twojego Capfile. Komentarz te dwie linie

 
#require 'capistrano/rails/assets' 
#require 'capistrano/rails/migrations' 

i umieścić tę linię w

 
require 'capistrano/rails' 

który będzie prawidłowo ustawić zmienną RAILS_ENV.

+0

Świetny. Magia... :/ – yekta

1

Co się stanie, jeśli dodasz plik:

deploy/production.rb 

Z tej linii:

set :stage, :production 
+0

Mam ten plik – Kazmin

7

Wydaje się być to błąd w CAPISTRANO szyn.

Jest to zadanie (rails.rake), które ustawia środowisko albo z RAILS_ENV lub etapu:

namespace :deploy do 
    before :starting, :set_rails_env do 
    set :rails_env, (fetch(:rails_env) || fetch(:stage)) 
    end 
end 

Ale to zadanie nie jest wywoływana przed tj aktywów: prekompilacji. Tak więc:

namespace :assets do 
    task :precompile do 
    on roles :web do 
     within release_path do 
     with rails_env: fetch(:rails_env) do 
      execute :rake, "assets:precompile" 
     end 
     end 
    end 
    end 
end 

nie działa, ponieważ wartość rails_env jest zerowa, jeśli nie jest ustawiona jawnie.

Jeśli będę miał czas na głębsze kopanie, prześlę zgłoszenie błędu.

8

oparciu o odpowiedź Marca, które z pewnością wydaje się być słuszna,

to można obejść, dopóki nie zostanie ustalona przed dodając to do config/deploy.rb w „nazw: wdrożenie” blok:

desc 'Provision env before assets:precompile' 
    task :fix_bug_env do 
    set :rails_env, (fetch(:rails_env) || fetch(:stage)) 
    end 

    before "deploy:assets:precompile", "deploy:fix_bug_env" 

To wymusi załadowanie env i provisioning RAILS_ENV przed aktywami: prekompilacja zostanie wywołana.

11

Używanie nakładki 3 i capistrano_rails na szynach 4 Otrzymałem ten sam błąd; w pliku (-ach) środowiska wdrażane, ustawić

set :stage, :production 
set :rails_env, 'production' # even though doc says only need to do this if it's different 

Doc tutaj: https://github.com/capistrano/rails

1

Jeśli używasz pasażera, trzeba dodać

rails_env production; 

w na serwer www (np: nginx) .conf gdzie masz podane wartości passenger_ruby i passenger_root.

Powiązane problemy