2012-03-13 37 views
8

Khi tôi cố gắng để triển khai ứng dụng của tôi với capistrano, tôi sẽ nhận được lỗi này:Capistrano - không thể triển khai database.yml tôi

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

My database.yml tức là trống rỗng, database.staging .yml:

production: 
    adapter: mysql2 
    encoding: utf8 
    reconnect: false 
    database: my_db 
    pool: 15 
    username: my_user_name 
    password: my_pass 
    host: localhost 

trong /confing/triển khai là các tập tin "sản xuất" "dàn"

Tôi đang thiếu gì ở đây/tôi nên tìm thất bại ở đâu? Thông tin đăng nhập vào cơ sở dữ liệu trên máy chủ phải đúng.

EDIT - đây là triển khai của tôi

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 

Vấn đề:

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

điều gì sẽ xảy ra khi bạn chạy lệnh cp theo cách thủ công trên máy đó? –

+1

.yml hoặc .ymp? Nếu bạn có tệp .ymp có tên sai là – DGM

+0

.yml, số của tôi là ... – user984621

Trả lời

21

Tôi không chắc chắn làm thế nào để giải quyết vấn đề của bạn. Có vẻ như database.staging.yml không được triển khai, do đó không có gì để sao chép.

Tôi nghĩ rằng có một quy trình làm việc tốt hơn. Những thứ như cài đặt và cấu hình cơ sở dữ liệu thường không thay đổi giữa các lần triển khai, vì vậy những thứ đó có thể nằm trong thư mục được chia sẻ của tất cả các bản phát hành capistrano. Thông thường, bạn không muốn database.yml của bạn ở trong repo của bạn vì nó là thông tin nhạy cảm. Bạn có thể đáp ứng cả hai điều này bằng cách loại trừ config/database.yml trong số .gitignore của mình.

Điều này yêu cầu bạn thực hiện thiết lập một lần trên máy chủ của mình. Bạn cần tạo một số database.yml tại số your_app_path/shared/config. Chia sẻ là một anh chị em đến hiện tại và phát hành.

deploy.rb của bạn cần có tác vụ liên kết với phiên bản database.yml của bản phát hành mới được triển khai lên thư mục được chia sẻ trong thư mục được chia sẻ. Như thế này:

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 

Điều này có nghĩa là repo của bạn sẽ không chứa database.yml tệp. Vì chúng có lẽ đã có trong repo của bạn rồi. Bạn sẽ phải git rm chúng, cam kết. Thêm chúng vào .gitignore và cam kết điều đó.

+1

chúng tôi đã làm điều này, nhưng bao gồm một database.yml.example trong cấu hình, mà các nhà phát triển có thể sử dụng để đi địa phương mà không cần phải đoán tại các thiết lập database.yml – tehfoo

+0

Tôi nghĩ hiện tại/config/database.yml là liên kết với shared/config/database.yml Nếu shared/config/database.yml bị thiếu, nó sẽ cung cấp cho bạn 'No such file or directory'. Chúng ta có thể tạo nó theo cách thủ công để chia sẻ/config/database.yml và triển khai nó. Công cụ này hoạt động ở đây. – vajapravin

+0

Xin lỗi, tại sao tập lệnh 'deploy.rb' của bạn đề cập đến' settings.yml'? – Matthias

0

Nếu bạn không cần phải "đối tượng áp dụng tài liệu tham khảo hoặc các phương pháp" (1) trong quá trình tiền biên dịch sau đó bạn có thể OK với thiết config.assets.initialize_on_precompile-false trong config/application.rb

8

Trong Capistrano 3, nối các file được xây dựng-in. Câu trả lời của John chỉ đơn giản là:

  • Trong thư mục shared/ tạo config/database.yml
  • Trong config/deploy.rb sử dụng dòng này

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

này những gì John đang nói.

+0

Đây là nó. Cảm ơn – Francisco

+0

Làm cách nào để chúng tôi giải quyết vấn đề này cho phiên bản mới nhất, 3.8.0? –

Các vấn đề liên quan