Magentoを使ったサイトへの本番反映が抱える問題点

Magentoを使ったサイトに対し、変更を加える事は、オープンソース・ソフトウエアである以上ごく当たり前のことであると思います。
ですが、Magentoのディレクトリ構成には以下のような問題があります。

  • モジュール、テーマ、スキンディレクトリが別になっているので、アップロードする際に手間がかかる
  • データベースに対する更新処理が行われる場合には慎重な反映作業が求められる
  • 何かあった際に変更を取りやめる際にディレクトリの複雑さのために手間がかかる

当然のことながら、本番反映をする際にはきちんと手順を追って反映作業を行うのですが、

  • 反映対象のファイルを整理して、一括で反映できるように準備する
  • 容易に対象ファイルを抽出できるようにバージョン管理システムを導入する

ということは必要だと思います。
バージョン管理システムがあれば、その変更履歴を元に反映対象ファイルを抽出できます。
まだ導入されていない場合は、使い始めが少しむずかしいかもしれませんが、ぜひ導入されることをおすすめします。

さて、このエントリではMagentoの本番反映をラクにするためのツール「Magentify」を紹介します。

Magentifyとは?

Magentifyは、Alistair Stead氏が開発・公開している、「Capistrano」のMagento用レシピです。
Capistranoの良い所は、

  • あらかじめ決まった手順に沿って反映作業が行える
  • 複数のサーバーに並列的に作業が行える
  • 万一の際に巻き戻し処理が行える

というところです。
MagentifyはこのCapistranoのMagento専用のレシピと便利ツールをセットにしたもので、うまく使うことで安全・安心な本番反映ができるようになります。

Magentifyのインストール

Magentifyのインストールはとても簡単です。
デプロイシステムを構築したいサーバー上で、

gem install magentify

とタイプするだけでインストールできます。
とても簡単ですね。
もちろん、インストール前にはRubyGemのインストールをしておく必要があります。

デプロイプロジェクトのセットアップ

Magentifyのインストール後、デプロイプロジェクトのセットアップを行います。

mkdir /opt/magentify
cd /opt/magentify
magentify .
bundle install

とすることで、Magentifyのレシピを使用するCapistranoプロジェクトが作成できます。

デプロイプロジェクトの設定

Magentifyを使ったデプロイプロジェクトはCapistranoと同じ形式です。
/opt/magentify/config/deploy.rbに設定ファイルがあります。
設定ファイルを開くと、以下のように初期状態では記述されています。

set :application, "magento"
set :domain,      "#{application}.com"
set :deploy_to,   "/var/www/#{domain}"

set :user,        "deploy"
set :repository,  "git@github.com:user/project.git"
set :scm,         :git

role :web,        "000.000.000.000"   # Your HTTP server, Apache/etc
role :app,        "000.000.000.000"   # This may be the same as your `Web` server or a separate administration server

set  :keep_releases,  3

set :app_symlinks, ["/media", "/var", "/sitemaps", "/staging"]
set :app_shared_dirs, ["/app/etc", "/sitemaps", "/media", "/var", "/staging"]
set :app_shared_files, ["/app/etc/local.xml"]

:applicationにはアプリケーション名をつけます。任意につけるとよいでしょう。ただしデフォルトのままだと、この値をファイルをデプロイするディレクトリ名に流用してしまうので、環境に合わせて書き換えます。

次に:repositoryを設定します。GitHubや自社リポジトリなどを指定します。必要に応じて:userにユーザー名、:passwordを追加設定してパスワードを入れておきます。

そしてroleの:webと:appに、反映するサーバーのIPアドレスを入力します。
管理画面とフロントエンドを別サーバーにしている場合は両方書いても良いですし、:webだけを複数書いても構いません(複数書くと複数のサーバーにデプロイします)。 

最後に設定ファイルやvar、mediaディレクトリのためのシンボリックリンクを張る設定を記述します。
基本的に標準設定のままでも良いですが、フルページキャッシュや決済関係の設定ファイルなどがある場合は、ここに追加しておいてください。 

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

設定ファイルの調整ができたら、

bundle exec cap deploy:setup

を実行します。
うまく実行できると、デプロイ先サーバーの:deploy_toで指定したディレクトリ配下に

  • releases
  • shared

というディレクトリができます。
ここはCapistranoと同じ仕組みです。

うまくいかない場合はSSH接続IDやパーミッションなどを見なおしてみてください。

デプロイの実行

セットアップが完了し、実際にデプロイを実行する前に、Magentifyで利用できるコマンドを確認しておきましょう。

bundle exec cap -T

とすることで利用できるコマンドの一覧が表示されます。

cap deploy                 # [Overload] Deploys your project.
cap deploy:check           # Test deployment dependencies.
cap deploy:cleanup         # Clean up old releases.
cap deploy:cold            # [Overload] Default actions only calls 'update'.
cap deploy:create_symlink  # Updates the symlink to the most recently deployed version.
cap deploy:finalize_update # [Overload] Touches up the released code.
cap deploy:migrate         # [Overload] Default actions cancelled.
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:restart         # [Overload] Default actions cancelled
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           # Blank task exists as a hook into which to install your own environment specific behaviour.
cap deploy:stop            # Blank task exists as a hook into which to install your own environment specific behaviour.
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 deploy:web:disable     # Present a maintenance page to visitors.
cap deploy:web:enable      # Makes the application web-accessible again.
cap info                   # Show hosts
cap info:roles             # Show roles
cap invoke                 # Invoke a single command on the remote servers.
cap mage:cc                # Clear the Magento Cache
cap mage:clean_log         # Clean the Magento logs
cap mage:compiler          # Run the Magento compiler
cap mage:disable           # Disable the Magento install by creating the maintenance.flag in the web root.
cap mage:disable_compiler  # Disable the Magento compiler
cap mage:enable            # Enable the Magento stores by removing the maintenance.flag in the web root.
cap mage:enable_compiler   # Enable the Magento compiler
cap mage:files:pull        # Pull magento media catalog files (from remote to local with rsync)
cap mage:files:push        # Push magento media catalog files (from local to remote)
cap mage:finalize_update   # Touches up the released code.
cap mage:indexer           # Run the Magento indexer
cap mage:setup             # Prepares one or more servers for deployment of Magento.
cap shell                  # Begin an interactive Capistrano session.

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.

標準のCapistranoと異なる点は、「mage」で始まるコマンドが追加されている点です。
ログの削除やキャッシュのクリアだけでなく、メンテナンスモードの移行・解除が一斉にできる点も魅力です。
このようにMagentifyはMagentoを用いて構築したサイトの本番反映を簡単にするのみならず、メンテナンスを容易にするための機能も備えています。

さて、実際のデプロイですが、

bundle exec cap deploy

と実行することで、対象のサーバー全てに同時反映が行われます。
とても簡単ですね。 
もし、デプロイした内容に誤りがあり、デプロイ自体をやり直したい場合は、

bundle exec cap deploy:rollback

とすれば1つ前のデプロイ内容に戻すことができます。 

まとめ

Magentifyを使うことで、1台から複数台のサーバーに対するカスタマイズ内容を一括して反映することができます。
ファイルアップロードツールを使うよりも、安全で漏れのない作業ができる上、誰がやっても同じ結果が得られます。
また、Capistranoのレシピの書き方がわからなくても、MagentifyにはMagento用レシピが付属するので、すぐに使いはじめることができます。 

まだMagentifyを使ったことがない方は、ぜひお試しください。