Andrey Yasinishyn
Andrey Yasinishyn

Reputation: 1861

Deploy error using capistrano failed: "sh -c 'cat /home........current/REVISION

I get an error while deploying app to VPS by capistrano. cap deploy:setup, and cap deploy:check executes without error!

when I try to cap deploy:cold or simply cap deploy, I get this

[deploy:update_code] rolling back
  * executing [#<Capistrano::Command::Tree::ElseBranch:0x0000010141e798 @condition="else", @command="rm -rf /home/yasinishyn/apps/mkv/releases/20130505214957; true", @callback=#<Proc:0x0000010140f6a8@/usr/local/rvm/gems/ruby-2.0.0-p0/gems/capistrano-2.15.3/lib/capistrano/configuration/actions/invocation.rb:13>, @options={}, @skip=false>]
servers: ["xxx.xxx.xxx.xxx"]
[xxx.xxx.xxx.xxx] executing command
command finished in 225ms
failed: "sh -c 'cat /home/yasinishyn/apps/mkv/current/REVISION'" on xxx.xxx.xxx.xxx

How to debug this? where in an error? what does this means "failed: "sh -c 'cat /home/yasinishyn/apps/mkv/current/REVISION'" on 198.211.125.183"?

deploy.rb:

require "bundler/capistrano" 

server "xxx.xxx.xxx.xxx", :web, :app, :db, primary: true

set :application, "app" 
set :user, "user" 
set :deploy_to, "/home/#{user}/apps/#{application}" 
set :deploy_via, :remote_cache 
set :use_sudo, false
set :shared_children, shared_children + %w{public/uploads}

set :scm, "git" 
set :repository, "[email protected]:git_user/#{application}.git" 
set :branch, "master"

default_run_options[:pty] = true 
ssh_options[:forward_agent] = true


after "deploy", "deploy:cleanup" # keep only the last 5 releases

namespace :deploy do 
namespace :assets do
    task :precompile, :roles => :web do
      from = source.next_revision(current_revision)
      if capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ lib/assets/ app/assets/ | wc -l").to_i > 0
        run_locally("rake assets:clean && rake assets:precompile")
        run_locally "cd public && tar -jcf assets.tar.bz2 assets"
        top.upload "public/assets.tar.bz2", "#{shared_path}", :via => :scp
        run "cd #{shared_path} && tar -jxf assets.tar.bz2 && rm assets.tar.bz2"
        run_locally "rm public/assets.tar.bz2"
        run_locally("rake assets:clean")
      else
        logger.info "Skipping asset precompilation because there were no asset changes"
      end
    end

    task :symlink, roles: :web do
      run ("rm -rf #{latest_release}/public/assets &&
            mkdir -p #{latest_release}/public &&
            mkdir -p #{shared_path}/assets &&
            ln -s #{shared_path}/assets #{latest_release}/public/assets")
    end
  end
%w[start stop restart].each do |command|
    desc "#{command} unicorn server" 
    task command, roles: :app, except: {no_release: true} do
        run "/etc/init.d/unicorn_#{application} #{command}" 
    end
end

task :setup_config, roles: :app do 
    sudo "ln -nfs #{current_path}/config/nginx.conf /etc/nginx/sites-enabled/#{application}" 
    sudo "ln -nfs #{current_path}/config/unicorn_init.sh /etc/init.d/unicorn_#{application}" 
    run "mkdir -p #{shared_path}/config" 
    put File.read("config/database.example.yml"), "#{shared_path}/config/database.yml" 
    puts "Now edit the config files in #{shared_path}."
end
after "deploy:setup", "deploy:setup_config"

task :symlink_config, roles: :app do 
    run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
end
after "deploy:finalize_update", "deploy:symlink_config"
desc "Make sure local git is in sync with remote." 
task :check_revision, roles: :web do
    unless `git rev-parse HEAD` == `git rev-parse origin/master` 
        puts "WARNING: HEAD is not the same as origin/master"
        puts "Run `git push` to sync changes." 
        exit
    end 
end 
before "deploy", "deploy:check_revision" 
#rake seed task
desc "Seed the database on already deployed code"
task :seed, :only => {:primary => true}, :except => { :no_release => true } do
    run "cd #{current_path}; RAILS_ENV=#{rails_env} bundle exec rake db:seed"
end
desc "Seed the database on already deployed code"
task :drop, :only => {:primary => true}, :except => { :no_release => true } do
    run "cd #{current_path}; RAILS_ENV=#{rails_env} bundle exec rake db:drop:all"
    run "cd #{current_path}; RAILS_ENV=#{rails_env} bundle exec rake db:create:all"
    run "cd #{current_path}; RAILS_ENV=#{rails_env} bundle exec rake db:migrate"
end
end

Upvotes: 2

Views: 1823

Answers (1)

Andrey Yasinishyn
Andrey Yasinishyn

Reputation: 1861

I find an answer by my own

first delete this snippet from the deploy.rb

namespace :assets do
    task :precompile, :roles => :web do
      from = source.next_revision(current_revision)
      if capture("cd #{latest_release} && #{source.local.log(from)} vendor/assets/ lib/assets/ app/assets/ | wc -l").to_i > 0
        run_locally("rake assets:clean && rake assets:precompile")
        run_locally "cd public && tar -jcf assets.tar.bz2 assets"
        top.upload "public/assets.tar.bz2", "#{shared_path}", :via => :scp
        run "cd #{shared_path} && tar -jxf assets.tar.bz2 && rm assets.tar.bz2"
        run_locally "rm public/assets.tar.bz2"
        run_locally("rake assets:clean")
      else
        logger.info "Skipping asset precompilation because there were no asset changes"
      end
    end

    task :symlink, roles: :web do
      run ("rm -rf #{latest_release}/public/assets &&
            mkdir -p #{latest_release}/public &&
            mkdir -p #{shared_path}/assets &&
            ln -s #{shared_path}/assets #{latest_release}/public/assets")
    end
end

then delete load 'deploy/assets' from capfile, and run

cap deploy:cold

this will work without an error, but only on initial deploy. Then as usual "sudo service nginx restart" on server, and add back all deleter earlier snippets.

finally You may have an error:

ActionView::Template::Error (File to import not found or unreadable: bootstrap.
Load path: /home/yasinishyn/apps/mkv/releases/20130506160725
(in /home/yasinishyn/apps/mkv/releases/20130506160725/app/assets/stylesheets/bootstrap_and_overrides.css.scss)):

If you don't , change something in assets, for example add space to the top of application.css. Then git add ., git commit .... , git push, and after rerun

cap deploy

And BAMM!! It works :)

Upvotes: 11

Related Questions