CakePHPのプロジェクトをcapistranoでデプロイ

capistranoはRuby On Rails用に作られたデプロイツールで、
設定をすればPHPのプロジェクトにも利用できる。

デプロイを自動化できるため、最初の設定さえしておけば後が楽。
ツールのインストールはデプロイをする端末だけにすれば良く、
各サーバーには特に何もする必要はなし。

複数サーバーに対して一気にデプロイすることもできるので
同じソースを複数のサービスに使っている場合などには便利。

準備

Rubyで作られているツールなので
gemでインストール。

$ gem install -y capistrano

プロジェクトごとに適用

$ cd {project_path}
$ capify .

これで
{project_path}/Capistrano
{Project_path}/config/deploy.rb
が作成される。deploy.rbが設定ファイルなので
これを自分の環境に応じて変更する。

設定ファイル

CakePHP用の設定ファイルを公開してくださっている方がいたので
それを参照させてもらいつつ自分用に修正。

CakePHPをCapistranoを使って楽々デプロイしよう!

追加分の設定

set :ssh_options, :port => "99999" # SSHのポート指定

結構つまづいた部分。
gitリポジトリを置いているサーバーとデプロイ先が同じだったので
set :repository, “file:///var/git/xxxxx.git”
などと設定したがどうしてもエラーでできず。

結局、Capistranoを動かしている自分のMacに一旦展開してから
サーバーにアップするという設定に。
SSHの鍵設定などをサーバー間でしなくてすむ反面、回線が遅いと困ることもありそう。

# set :deploy_via, :export
set :deploy_via, :copy # 

delpoy:symlinkでは動かなかったので新しくなって変わったのかも。
deploy:create_symlinkに修正。
後は、CakePHP用にサーバー用の設定ファイルをsharedに置いてそこからシンボリックリンク。
また、tmp以下を.gitignoreで無視してるので必要なディレクトリを作成。

  desc "標準のシンボリック張り直し実行後に行う処理を記述する"
  # after "deploy:symlink", :roles => [:app] do
  after "deploy:create_symlink", :roles => [:app] do
    run "ln -fns #{shared_path}/system/database.php #{latest_release}/app/Config/database.php"
    run "ln -fns #{shared_path}/system/email.php #{latest_release}/app/Config/email.php"
    run "mkdir #{latest_release}/app/tmp/cache"
    run "mkdir #{latest_release}/app/tmp/cache/models"
    run "mkdir #{latest_release}/app/tmp/cache/persistent"
    run "mkdir #{latest_release}/app/tmp/cache/views"
    run "mkdir #{latest_release}/app/tmp/sessions"
    run "mkdir #{latest_release}/app/tmp/tests"
    run "chmod -R 777 #{latest_release}/app/tmp"

capistranoのコマンド

$ cap -T

と入力することで使用できるコマンドが表示される。
標準のものに加え、設定ファイルで自分が設定したものも出る。

cap deploy                 # Deploys your project.
cap deploy:check           # Test deployment dependencies.
cap deploy:cleanup         # Clean up old releases.
cap deploy:cold            # Deploys and starts a `cold' application.
cap deploy:create_symlink  # Updates the symlink to the most recently deployed version.
cap deploy:finalize_update # CakePHP用にfinalize_updateを上書きする
cap deploy:migrate         # Run the migrate rake task.
cap deploy:migrations      # Deploy and run pending migrations.
cap deploy:pending         # Displays the commits since your last deploy.
cap deploy:pending:diff    # Displays the `diff' since your last deploy.
cap deploy:rollback        # Rolls back to a previous version and restarts.
cap deploy:rollback:code   # Rolls back to the previously deployed version.
cap deploy:setup           # Prepares one or more servers for deployment.
cap deploy:start           # 標準のシンボリック張り直し実行後に行う処理を記述する
cap deploy:symlink         # Deprecated API.
cap deploy:update          # Copies your project and updates the symlink.
cap deploy:update_code     # Copies your project to the remote servers.
cap deploy:upload          # Copy files to the currently deployed version.
cap development            # Set the target stage to `development'.
cap invoke                 # Invoke a single command on the remote servers.
cap multistage:prepare     # Stub out the staging config files.
cap production             # Set the target stage to `production'.
cap shell                  # Begin an interactive Capistrano session.
cap staging                # Set the target stage to `staging'.

Some tasks were not listed, either because they have no description,
or because they are only used internally by other tasks. To see all
tasks, type `cap -vT'.

Extended help may be available for these tasks.
Type `cap -e taskname' to view it.

デプロイ先(サーバー)の準備

端末からサーバーにSSHで入れるようにしておく。

設定ファイルで指定する、プロジェクトのソースを置くための
ディレクトリは事前に作っておく。
SSHで入るユーザーがディレクトリの操作権限を持っているようにする。

その上で、下記のコマンドで必要なディレクトリを作成

cap deploy:setup

毎回のデプロイ作業

cap deploy

と入力するだけ。場合によってはjenkinsから実行させても良い。

(追記)git submoduleの管理

Plugin/Debugkit などをgit submoduleで管理していたが
git cloneしても取得されないのでエラーになっていた。

config/deploy.rb に下記を追加して解決。

set :git_enable_submodules, 1

Categories:

,

Tags:


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA