- 更新日: 2016年12月22日
- PHP & CakePHP
CakePHPアプリケーションをCapistranoでデプロイ
CakePHP アプリケーションを、Ruby 製のデプロイツールである Capistrano を使って自動でデプロイする方法です。Capistrano および Capistrano::Composer を使います。
https://github.com/capistrano/capistrano
https://github.com/capistrano/composer/
いずれも Ruby Gem のライブラリとなりますので、事前に Ruby, Bundler などの環境が構築されている前提です。
— 環境 —
CakePHP 3.2.5
Ruby 2.2.3
capistrano 3.4.0
capistrano-composer 0.0.6
では、以降 Capistrano で CakePHP アプリケーションをデプロイする手順。
capistrano と capistrano-composer の gem インストール
まずは、capistrano と capistrano-composer の gem をインストールします。Gemfile に追記してインストール。
Gemfile
1 2 3 4 5 |
source "https://rubygems.org" ruby "2.2.3" gem "capistrano" gem 'capistrano-composer' |
–path vendor/bundle のオプションを付けて、vendor/bundle ディレクトリ以下にインストールします。
1 2 3 4 |
$ cd /path/to/cakeapp $ bundle install --path vendor/bundle |
Capistrano 関連ファイルを生成・編集
続いて、cap install コマンドで Capistrano が使うファイルを生成する。
1 2 3 4 5 6 7 8 9 10 |
$ bundle exec cap install mkdir -p config/deploy create config/deploy.rb create config/deploy/staging.rb create config/deploy/production.rb mkdir -p lib/capistrano/tasks create Capfile Capified |
上記ファイル郡が生成されました。
Capfile を編集します。
Capfile
1 2 3 4 5 6 7 8 9 10 11 |
# Load DSL and Setup Up Stages require 'capistrano/setup' # Includes default deployment tasks require 'capistrano/deploy' # Includes tasks from other gems included in your Gemfile require 'capistrano/composer' # Loads custom tasks from `lib/capistrano/tasks' if you have any defined. Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r } |
Capistrano のデプロイ・スクリプトを作成
後は、Capistrano 用のデプロイスクリプトを作成します。作成済みの config/deploy.rb および config/deploy/production.rb を編集する。
config/deploy.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
set :application, 'cakeapp' set :repo_url, 'repo_url' set :deploy_to, '/path/to/cakeapp' set :scm, :git set :linked_files, %w{config/secrets.yml config/app.php config/environments/production.php} set :linked_dirs, %w{logs tmp vendor} set :default_env, { path: "/usr/local/bin:$PATH" } set :keep_releases, 5 set :composer_install_flags, '--no-dev --prefer-dist --no-interaction --optimize-autoloader' SSHKit.config.command_map[:composer] = "/usr/local/bin/composer" namespace :deploy do # upload files desc 'Upload files' task :upload do on roles(:app) do |host| if test "[ ! -d #{shared_path}/config ]" execute "mkdir -p #{shared_path}/config" end if test "[ ! -d #{shared_path}/config/environments ]" execute "mkdir -p #{shared_path}/config/environments" end upload!('config/secrets.yml', "#{shared_path}/config/secrets.yml") upload!('config/app.php', "#{shared_path}/config/app.php") upload!('config/environments/production.php', "#{shared_path}/config/environments/production.php") end end desc 'Restart application' task :restart do on roles(:app), in: :sequence, wait: 5 do # Your restart mechanism here, for example: # execute :touch, release_path.join('tmp/restart.txt') end end after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do # Here we can do anything such as: # within release_path do # execute :rake, 'cache:clear' # end end end namespace :migrations do desc "execute migration" task :migrate do on roles(:app) do |host| execute "cd #{current_path}; bin/cake migrations migrate" end end desc "rollback migration" task :rollback do on roles(:app) do |host| execute "cd #{current_path}; bin/cake migrations rollback" end end end after 'deploy:publishing', "deploy:migrations:migrate" after 'deploy:finishing', 'deploy:cleanup' end |
ファイルアップロード用のタスク(deploy:upload)、マイグレーション実行用のタスク(deploy:migrations:migrate)とロールバック用のタスク(deploy:migrations:rollback)などを作成しました。
1 |
after 'deploy:publishing', "deploy:migrations:migrate" |
の行により、マイグレーションのタスク(deploy:migrations:migrate)は、deploy:publishing の後に自動で実行される設定です。
環境ごとの role を config/deploy/production.rb に設定します。
config/deploy/production.rb
1 2 3 4 5 |
set :stage, :production role :app, %w{username@example.com} role :web, %w{username@example.com} role :db, %w{username@example.com} |
以上で、デプロイスクリプトは完成です。
デプロイ関連のコマンド
デプロイが上手く動作するかの事前チェック。
1 2 3 |
$ bundle exec cap production deploy:check |
ファイルのアップロード。
1 2 3 |
$ bundle exec cap production deploy:upload |
デプロイ実行。
1 2 3 |
$ bundle exec cap production deploy |
上記のデプロイ関連コマンドを必要に応じて使います。
その他遭遇した問題と対処法
デプロイ先サーバーに Composer が入っていなかったら、前もってインストールしておきます。
1 2 3 4 5 |
$ cd /var/tmp $ curl -sS https://getcomposer.org/installer | php $ mv composer.phar /usr/local/bin/composer |
デプロイ時に次のエラーが出た場合は…
1 2 3 |
Composer should be invoked via the CLI version of PHP, not the cgi-fcgi SAPI |
Composer インストールを以下のようにします。
1 2 3 4 5 6 7 8 9 10 |
$ cd /var/tmp $ curl -sS https://getcomposer.org/installer | php $ mv composer.phar /usr/local/ $ cd /usr/local/bin/ $ vi composer #!/usr/bin/env bash /usr/bin/env php-cli -d allow_url_fopen=On -d detect_unicode=Off /usr/local/composer.phar $* $ chmode 755 composer |
また CakePHP では intl 絡みのエラーがよく発生するのですが、その場合は intl 拡張を入れて対処します。
CakePHPデプロイでPHP extension intlエラー | EasyRamble
以上で、デプロイが無事に成功しました。CakePHP アプリケーションも簡単に自動デプロイを可能にしてくれる Capistrano は本当に便利です。ウェブアプリケーションのデプロイには手放せない必須ツールですね。
- – 参考リンク –
- Capistrano3とBitbucketを使ってRailsアプリをデプロイ | EasyRamble
- Capistrano3でRails4.1アプリケーションをデプロイ | EasyRamble
- CakePHP2アプリケーションをCapistranoでデプロイする | Ryuzee.com
- CakePHPのプロジェクトをcapistranoでデプロイ | 江島@システム開発
- FuelPHPアプリをCapistrano3でデプロイ – Capistrano環境構築編 | hrendoh’s memohrendoh’s memo
- PHP & CakePHP の関連記事
- PHP+MySQLでNo such file or directoryエラー
- bin/cakeコマンドでintlエラーが出る場合の対処(CakePHP)
- Integrity constraint violation:Column ‘created’ in order clause is ambiguousエラー/CakePHP
- CakePHPでDB関連テーブルのレコード・データを取得
- CakePHPでカラム属性に別名/エイリアスを付ける仮想フィールド
- CakePHPで日付選択フォームのカスタマイズ
- CakePHP3で現在のコントローラー名・アクション名を取得
- PHPインストールでconfigure: error: freetype.h not foundエラー
- CakePHPでログイン後に元のページにリダイレクトさせる
- CakePHPで全てのモデル/テーブル名一覧を取得
- 初回公開日: 2016年3月28日
Leave Your Message!