私はCapistrano
が初めてで、共有フォルダーとオプション:linked_files
があることを確認しました。共有フォルダーは、リリース間でファイルを保持するために使用されると思います。しかし、私の質問は、どのようにしてファイルが共有フォルダーにあるのでしょうか?
また、別のディレクトリを現在のディレクトリにシンボリックリンクしたい場合は、いくつかのパスの静的フォルダ、linked_dirs
に配置するにはどうすればよいですか?
最後に、chmod 755
をlinked_filesおよびlinked_dirsに設定する方法。
ありがとうございました。
アプリ内のフォルダーは、共有ディレクトリ内のフォルダーへのシンボリックリンクです。アプリがlog/production.log
に書き込む場合、実際には../shared/log/production.log
に書き込みます。これが、ファイルが共有フォルダーに配置される方法です。
Capistranoの機能仕様またはテスト を見ると、これがどのように機能するかを確認できます。
これらの共有ファイルをchmodしたい場合、sshを介して1回だけ直接行うことができます。これらは、作成後にCapistranoによって変更されることはないからです。
リンクされたディレクトリを追加するには、deploy.rb
で:
set :linked_dirs, %w{bin log tmp/backup tmp/pids tmp/cache tmp/sockets vendor/bundle}
または
set :linked_dirs, fetch(:linked_dirs) + %w{public/system}
Capistrano 3の設定ファイルを各サーバーの共有フォルダーにアップロードするタスクを作成しました。これらのディレクトリを順番に確認します。
そして、見つかったすべての設定ファイルをアップロードします。ファイルが変更された場合にのみファイルがアップロードされます。また、両方のディレクトリに同じファイルがある場合、2番目のディレクトリは無視されることに注意してください。
コードは次のとおりです。 https://Gist.github.com/Jesus/448d618c83fb0445ebbf
最後に、このタスクは設定をアップロードするだけです。ファイルをリモート共有フォルダに追加しますが、linked_files
in config/deploy.rb
、例:
set :linked_files, %w{config/database.yml config/aws.yml}
更新:
Gitを使用している場合は、これらのファイルを無視することをお勧めします。
echo "config/deploy/config/*" >> .gitignore
Capistrano 3.5では、配列フィールドにappend
が導入されました。 公式ドキュメントから 、これらを使用する必要があります:
共有ファイルの場合:
append :linked_files, %w{config/database.yml}
共有ディレクトリの場合:
append :linked_dirs, %w{bin log public/uploads vendor/bundle}
連続したリリースで変更したくないファイルを置くために従うことができる3つの簡単なステップがあります。ファイルをlinked_filesリストに追加します。
set :linked_files, fetch(:linked_files, []).Push('config.php')
共有するすべてのファイルを選択します。 scpを介してこのファイルをローカルサーバーからリモートサーバーに配置します
scp config.php deployer@Amazon:~/capistrano/shared/config.php
次に、以下のコマンドを使用してデプロイします。
bundle exec cap staging deploy
もちろん、ステージングは要件ごとに変更できます。要件は製品、サンドボックスなどです。
もう1つ、チームメンバーにそのようなファイルをコミットさせたくないためです。したがって、このファイルを.gitignoreファイルに配置します。そして、それをgit remote repoにプッシュします。
Capistrano 3.5 +の場合、 official doc で指定されているとおり:
append :linked_dirs, ".bundle", "tmp"
私にとっては上記のどれでも機能しなかったため、展開プロセスの最後に2つの機能を追加することになりました。
namespace :your_company do
desc "remove index.php"
task :rm_files do
on roles(:all) do
execute "rm -rf #{release_path}/index.php"
end
end
end
namespace :your_company do
desc "add symlink to index.php"
task :add_files do
on roles(:all) do
execute "ln -sf #{shared_path }/index.php #{release_path}/index.php"
end
end
end
after "deploy:finished", "your_company:rm_files"
after "deploy:finished", "your_company:add_files"