Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capistrano doesn't obey "within release_path"

I have this task:

namespace :custom do
  desc "create a symlink to db config already on the server"
  task :symlink_db_config do
    on roles(:web) do
      within release_path do
        execute "pwd"
      end

      within release_path do
        execute "ln -nfs /home/blog/config/database.yml ./database.yml"
      end
    end
  end
end

For some infuriating reason, the pwd command is preceded by a cd to the release path, but the ln command is not. Why is that?

Here's the output, showing the above:

** Invoke custom:symlink_db_config (first_time)
** Execute custom:symlink_db_config
DEBUG[352cc4bb] Running /usr/bin/env if test ! -d /home/blog/staging/releases/20141010050707; then echo "Directory does not exist '/home/blog/staging/releases/20141010050707'" 1>&2; false; fi on 172.245.32.193
DEBUG[352cc4bb] Command: if test ! -d /home/blog/staging/releases/20141010050707; then echo "Directory does not exist '/home/blog/staging/releases/20141010050707'" 1>&2; false; fi
DEBUG[352cc4bb] Finished in 0.199 seconds with exit status 0 (successful).

// Here's the `pwd`; note the proper `cd` that occurs first:

INFO[67a83a04] Running /usr/bin/env pwd on 172.245.32.193
DEBUG[67a83a04] Command: cd /home/blog/staging/releases/20141010050707 && /usr/bin/env pwd
DEBUG[67a83a04]     /home/blog/staging/releases/20141010050707
INFO[67a83a04] Finished in 0.268 seconds with exit status 0 (successful).
DEBUG[f46f64b3] Running /usr/bin/env if test ! -d /home/blog/staging/releases/20141010050707; then echo "Directory does not exist '/home/blog/staging/releases/20141010050707'" 1>&2; false; fi on 172.245.32.193
DEBUG[f46f64b3] Command: if test ! -d /home/blog/staging/releases/20141010050707; then echo "Directory does not exist '/home/blog/staging/releases/20141010050707'" 1>&2; false; fi
DEBUG[f46f64b3] Finished in 0.243 seconds with exit status 0 (successful).

//And now here's the `ln`... but where is the `cd`?  I said `within release_path`, didn't I?

INFO[afdbd89c] Running /usr/bin/env ln -nfs /home/blog/config/database.yml ./database.yml on 172.245.32.193
DEBUG[afdbd89c] Command: ln -nfs /home/blog/config/database.yml ./database.yml
INFO[afdbd89c] Finished in 0.219 seconds with exit status 0 (successful).

So my ln fails because it's not in the right directory. Why didn't capistrano cd into the release directory like I told it to?

(Capistrano 3.2.1, by the way)

like image 276
Grant Birchmeier Avatar asked Feb 11 '23 20:02

Grant Birchmeier


1 Answers

There's useful information in another answer here but briefly it seems the problem arises when there are spaces in the command you want to run.

I followed bricker's suggestion, e.g.

within release_path do
  execute *%w[ ln -nfs /home/blog/config/database.yml ./database.yml ]
end
like image 124
Leo Avatar answered Mar 17 '23 04:03

Leo