capifonyでSymfony2アプリをコマンド一発デプロイ

2014年1月2日

symfony-logo

Symfony2 で作られたアプリケーションを capifony を使ってコマンド一発デプロイする方法を紹介します。デプロイを自動化しておくと後々すごく楽なので、プロジェクト発足時に仕組みを作っておくと良いと思います。

動作確認環境

  • Mac OS X 10.9
  • ruby 2.1
  • Capistrano 2.15
  • capifony 2.8
  • Symfony 2.6

目次

  1. デプロイ先サーバに ssh 鍵認証でログインできるようにしておく
  2. デプロイコマンド実行マシンに ruby をインストール
  3. capifony をインストール
  4. deploy.rb を編集する
  5. 異なる環境にデプロイする
  6. デプロイ先サーバのセットアップ
  7. デプロイ実行
  8. データベースのマイグレーションも実行される

デプロイ先サーバに ssh 鍵認証でログインできるようにしておく

デプロイコマンド実行マシンからデプロイ先サーバに ssh 鍵認証でログインできるようにしておきます。パスワード認証方式でもデプロイできますが、今回は鍵認証方式でデプロイします。

手順は以前書いた記事が参考になるかもしれません。

お名前.com VPS を借りて最初にやったこと(1) ユーザ作成とSSH設定

デプロイコマンド実行マシンに ruby をインストール

デプロイコマンドを実行するマシンに ruby をインストールします。私は手元の Mac に ruby をインストールしてデプロイを実行しています。

Mac に ruby をインストールしたときの私のメモはこちら

MacにHomebrewでrbenvをインストールして複数バージョンのrubyを管理

capifony をインストール

ruby をインストールできたら RubyGems から capifony をインストールします。

$ gem install capifony

Symfony2 プロジェクトルートに移動して、capifony をセットアップします。

$ cd path/to/your/symfony2-project
$ capifony .

capifony コマンドを実行すると Capfile と app/config/deploy.rb が作成されます。

deploy.rb を編集する

作成された app/config/deploy.rb にデプロイ設定を記述します。

app/config/deploy.rb

# MAX_LEVEL, IMPORTANT, INFO, DEBUG
logger.level = Logger::INFO
default_run_options[:pty] = true
set :stage_dir,           "app/config/deploy"
set :stages,              %w(production, staging)
set :default_stage,       "production"
require 'capistrano/ext/multistage'
set :use_sudo,            false
set :keep_releases,       2
set :deploy_via,          :remote_cache
set :use_composer,        true
set :update_vendors,      false
set :copy_vendors,        true
set :app_path,            "app"
set :shared_files,        ["composer.phar", "app/config/parameters.yml"]
set :shared_children,     [log_path, "vendor"]
set :assets_symlinks,     true
set :dump_assetic_assets, true
set :permission_method,   :acl
set :use_set_permissions, true
set :php_bin,             "/usr/bin/php"
set :interactive_mode,    false
before "symfony:cache:warmup", "symfony:doctrine:migrations:migrate"
after "deploy", "deploy:cleanup"

ざっくり解説すると

  • composer はデプロイ時に self-update で自動更新。
  • composer.phar は事前にダウンロードして shared フォルダに置いておく。
  • composer.phar install コマンドで vender を更新。
  • データベースのマイグレーション doctrine:migrations:migrate コマンド実行時に確認メッセージを表示しない。
  • デプロイ後に古いリリースセットを 2 個残して削除。
  • デプロイ時のログを詳細に表示。

異なる環境にデプロイする

通常、本番環境にいきなりデプロイすることは少なく、検証環境での動作確認を経て本番デプロイをします。production.rb, staging.rb にそれぞれの環境の設定を記述します。

app/config/deploy/production.rb

set :domain,      "deploy host"
#set :domain,     ["deploy host1", "deploy host2"]
role :web, domain
role :app, domain, :primary => true
set :deploy_to,   "deploy directory"
set :repository,  "repository url"
set :scm,         :git
set :branch,      "master"
set :user, "ssh user"
ssh_options[:port] = "22"
ssh_options[:keys] =  [File.join(ENV["HOME"], ".ssh", "id_rsa")]
set :webserver_user, "www"

app/config のファイル構成はこんな感じ。

$ tree app/config

app/config
├── ...
├── deploy.rb
├── deploy/production.rb
├── deploy/production.rb.dist
├── ...

デプロイ先サーバのセットアップ

デプロイ元から cap deploy:setup コマンドを実行して、デプロイ先サーバをセットアップします。

$ cd path/to/your/symfony2-project
$ cap production deploy:setup

デプロイ先にログインして、作成された shared フォルダに app/config/parameters.yml と composer.phar を設置します。

$ cd /var/www/example.com/shared
$ mkdir -p app/config
$ touch parameters.yml
$ curl -sS https://getcomposer.org/installer | php

composer.phar を shared フォルダに事前ダウンロードしておくと、デプロイが若干早くなります。事前にダウンロードしていない場合、composer を毎回 curl コマンドでダウンロードするようになっているようです。

デプロイ先サーバでは、github から ソースコードを clone するので、デプロイ先サーバに git をインストールしておくこともお忘れなく。

デプロイ実行

準備は整いました。デプロイ元から cap deploy コマンドを実行します。

$ cap production deploy

--> Updating code base with remote_cache strategy
--> Creating cache directory................................✔
--> Creating symlinks for shared directories................✔
--> Creating symlinks for shared files......................✔
--> Normalizing asset timestamps............................✔
--> Copying vendors from previous release...................✔
--> Updating Composer.......................................✔
--> Installing Composer dependencies........................✔
--> Setting permissions.....................................✔
--> Dumping an optimized autoloader.........................✔
--> Warming up cache........................................✔
--> Dumping all assets to the filesystem....................✔
--> Clear controllers.......................................✔
--> Successfully deployed!
(文字数の都合上、詳細なログは消しています)

うまくデプロイできましたか。できなかった場合はエラーになった箇所をログから確認しましょう。デプロイ先サーバで tree コマンドを実行すると、こんな感じになっています。

tree /var/www/example.com -L 2

/var/www/example.com
├── current -> /var/www/example.com/releases/20140106001857
├── releases
│   ├── 20140101234317
│   └── 20140106001857
└── shared
    ├── app
    ├── cached-copy
    ├── composer.phar
    └── vendor

データベースのマイグレーションも実行される

DoctrineMigrationsBundle でデプロイ時にデータベースのマイグレーションも実行しています。導入方法は以下の記事をどうぞ。

symfony-logo
Symfony2のDoctrineMigrationsBundleで簡単マイグレーション

Symfony2 の DoctrineMigrationsBundle を使ってデータベースのマイグレーションを行う方法 ...

続きを見る

終わりに

capifony を使って Symfony2 アプリケーションをコマンド一発でデプロイする方法を紹介しました。今後は複数環境にデプロイする方法や、Jenkins からデプロイする方法など調べていきたいと思います。

-技術ブログ
-