cap [env] deploy した時にmkdirでpermission deniedに遭遇した。
検索するとすぐ出てくる話なので、あるあるなんだろうけどメモしておく。
問題のコードはこのタスク以降のdeploy:check関係
capistrano-3.2.1/lib/capistrano/tasks/deploy.rake
43 namespace :check do
44 desc 'Check shared and release directories exist'
45 task :directories do
46 on release_roles :all do
47 execute :mkdir, '-pv', shared_path, releases_path
48 end
49 end
shared_pathとかreleases_pathの場所に権限がないと怒られる。
公式とかこの辺を見ると、sudoを使う方法が紹介されてたので真似してみた。
今回はあくまでcap [env] deployを使いたかったので、deploy:check:directoriesをorverwriteすることにした。
deploy.rb
namespace :deploy do
Rake::Task["deploy:check:directories"].clear
namespace :check do
desc '(overwrite) Check shared and release directories exist'
task :directories do
on release_roles :all do
execute :sudo, :mkdir, '-pv', shared_path, releases_path
execute :sudo, :chown, '-R', "#{fetch(:user)}:#{fetch(:group)}", deploy_to
end
end
end
(たぶん)ミソはdeploy:check:directoriesを一旦消してから定義してるところ。
それと、mkdirの後にchownでdeploy_toの所有者を変えてるところ。
deploy:check:directoriesは一旦消さないと、overwriteしても古い方のタスクが呼ばれて解決しなかった。
chownしてるのは、deploy:check:directories以降のタスクでもmkdirしてるので、丸ごと所有者を変えて、以降の処理ではsudo不要にしたかったため。