このエントリはMagento Advent Calendar 2016の8日目です。

以前のエントリ「Magento2プロジェクトの管理体制」で弊社でのMagento2プロジェクトの管理方法をご紹介しました。
今回はそのなかでも一番最後の部分に当たる、「Capistranoでデプロイする」を解説します。

なぜデプロイツールが必要なのか

Magento2を使ったサイトを運用していく上で重要なのは「どのようにプログラムと各種データを更新していくか」ということです。
Magentoは1系も2系も非常に多くのファイルから構成されている上、更新対象のファイルを漏れなく確実に反映していくことはかなり大変です。
さらにMagento2ではファイルの更新後に所定のコマンドを実行する必要があるため、手順はこれまでよりも複雑になっています。

Magento2での標準的なデプロイの流れ

Magento2でアプリケーションに何か更新を加えたい場合、以下のような手順に沿って作業を行います。 

  1. 反映するファイル一式を用意する
  2. メンテナンスモードを有効にする
  3. ファイル一式をサーバーに反映する
  4. (必要であれば)エクステンション・テーマを有効にする
  5. (必要であれば)データベースに対する更新処理を実施する
  6. Magentoのキャッシュをクリアする
  7. (Productionモードの場合)静的ファイルをデプロイする
  8. (Productionモードの場合)コンパイル処理を実施する
  9. メンテナンスモードを無効にする

Magento1.xでは、手順1,3,6程度で済んでいましたが、Magento2では最大3倍の作業工程が必要になります。
人的なミスを回避するためには、これらをできるだけ自動化する必要があります。 

Capistranoとは

CapistranoはRubyで書かれた自動デプロイツールです。所定の手順通りに各種コマンドを実行することができる上、複数台のサーバーに並行して処理を行わせることもできます。
主にRubyを使用したシステムやWebサイトなどで使われていますが、Magento向けの手順(レシピ)も以前から提供されています。
レシピを使うことで、Magentoに固有の手順をCapistranoから利用することができ、初心者でも比較的簡単にデプロイ環境を整えることができます。

 Magento2用Capistranoレシピ「capistrano-magento2」

capistrano-magento2」というレシピがCapistrano3用に公開されています。
開発をしているのはDavid Algerさん(Magento Masterの1人です)で、Magento2を操作する以下のコマンドがCapistrano3用に実装されています。

cap magento:cache:clean                   # Clean Magento cache by types
cap magento:cache:disable                 # Disable Magento cache
cap magento:cache:enable                  # Enable Magento cache
cap magento:cache:flush                   # Flush Magento cache storage
cap magento:cache:status                  # Check Magento cache enabled status
cap magento:cache:varnish:ban             # Add ban to Varnish for url(s)
cap magento:composer:install              # Run composer install
cap magento:indexer:info                  # Shows allowed indexers
cap magento:indexer:reindex               # Reindex data by all indexers
cap magento:indexer:set-mode[mode,index]  # Sets mode of all indexers
cap magento:indexer:show-mode[index]      # Shows mode of all indexers
cap magento:indexer:status                # Shows status of all indexers
cap magento:maintenance:allow-ips[ip]     # Sets maintenance mode exempt IPs
cap magento:maintenance:disable           # Disable maintenance mode
cap magento:maintenance:enable            # Enable maintenance mode
cap magento:maintenance:status            # Displays maintenance mode status
cap magento:setup:di:compile              # Runs dependency injection compilation routine
cap magento:setup:permissions             # Sets proper permissions on application
cap magento:setup:static-content:deploy   # Deploys static view files
cap magento:setup:upgrade                 # Run the Magento upgrade process

今回はこのレシピを使って、Capistrano3でデプロイできる環境を構築します。 

デプロイ環境を整える

それではデプロイ環境を整えていきましょう。
Capistranoでデプロイをするためには、いくつか手順が必要です。

ここでは以下の手順に沿って解説していきます。 

  1. gitリポジトリを作る
  2. composerでサイトの土台を作る
  3. Capistranoをインストールする
  4. レシピを調整する
  5. デプロイ先サーバーに必要なファイルを作成する
  6. デプロイを実行する

gitリポジトリを作る

最初にデプロイに使用するためのgitリポジトリを作ります。
リビジョン管理ツールを使ったことがない方にとっては馴染みが薄いかもしれませんが、Magentoそのものも現在ではgitで管理されています。

現在ではGithubBitBucket、Amazon CodeCommitなどを使うと比較的簡単にgitリポジトリを作ることができるので、うまく活用すると良いでしょう。
リポジトリができたら手元の環境にcloneしておきます。

composerでサイトの土台を作る

Magentoにはいくつかのインストール方法がありますが、ここではcomposerを用いてサイトの土台を作ります。
(先に「Magento2をcomposerからインストールする」を読んでおいていただくと、理解が早いと思います)

cloneしたgitリポジトリのディレクトリで以下のコマンドを実行します。
(composerは先にセットアップしておいてください)

composer create-project --no-install --repository-url=https://repo.magento.com/ magento/project-community-edition

もし、手元の環境でMagentoをインストールする必要がある場合は、以下の手順で行います。

  1. composer installを実行し、必要なライブラリをインストール
  2. MySQLにデータベースを作成する
  3. コマンドもしくはブラウザのインストーラを用いてMagentoをインストール

無事にインストールができたら、ここまで準備したファイル一式をgitに登録しておきます。
Magentoをインストールしない場合はそのままファイル一式を登録してください。

Capistranoをインストールする

デプロイ作業の起点となるLinuxサーバー(あるいはMacOSなどUnix環境)にCapistranoをインストールします。
CapistranoはRubyがインストールされている環境であれば、 

  1. gem install capistrano
  2. gem install capistrano-magento2

でインストールすることができます。前者はCapistrano本体。後者はMagento2用レシピです。

Capistranoとレシピがインストールできたら、適当なディレクトリで以下のコマンドを実行します。 

  1. mkdir <任意のディレクトリ名>
  2. cd <作成したディレクトリ名>
  3. cap install 

これでCapistranoのインストールは完了です。 

レシピを調整する

次にレシピを調整します。
Capistranoをインストールした段階では以下のようなファイル・ディレクトリが作成されます。

├── Capfile
├── config
│ ├── deploy
│ │ ├── production.rb
│ │ └── staging.rb
│ └── deploy.rb
├── lib
│ └── capistrano
│ └── tasks
└── log

まずはCapfileをカスタマイズします。 

Capfileのカスタマイズ

Capfileではこのデプロイ定義全体で使用するレシピの読み込みや外部ライブラリの定義を行います。
ここでは標準のCapfileを以下のように書き換えておきます。

# Load DSL and set up stages
require "capistrano/setup"

# Include default deployment tasks
require "capistrano/deploy"
# Load Magento deployment tasks
require 'capistrano/magento2/deploy'

require 'capistrano/git'
# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }

重要なポイントは、

# Load Magento deployment tasks
require 'capistrano/magento2/deploy'

という1行です。
この行を定義することで、Magento2用のデプロイレシピをCapistranoに読み込ませることができます。

deploy.rbのカスタマイズ

次にデプロイ作業全体の環境変数などを定義していきます。
deploy.rbを以下のように編集します。

#config valid only for current version of Capistrano
lock '3.6.1'
set :application, 'example' set :deploy_to, "<デプロイ先ディレクトリ>" set :repo_url, "<gitリポジトリのURL>"

この他にもCapistranoとcapistrano-magento2では多くの設定パラメータが利用できます。
状況に応じてカスタマイズしましょう。

ステージファイルのカスタマイズ

Capistrano3の場合、デフォルトのインストールでは

  • production.rb
  • staging.rb

の2つのステージファイルが作成されます。
productionが本番用。stagingがテスト・検証環境用です。
ここでは以下のようにそれぞれのファイルを編集します。
(パスやURLは適宜読み替えてください)

production.rb
server 'www.example.com', user: 'www-data', roles: %w{app db web}

set :deploy_to, '/var/www/html'
set :branch, proc { `git rev-parse --abbrev-ref master`.chomp }
staging.rb
server 'stage.example.com', user: 'www-data', roles: %w{app db web}

set :deploy_to, '/var/www/html'
set :branch, proc { `git rev-parse --abbrev-ref develop`.chomp }

デプロイ先サーバーに必要なファイルを作成する

レシピの準備ができたら、デプロイ先サーバーに必要なファイルを作成します。
capistrano-magento2の場合は、最低でも以下の2つのファイルが必要です。

  • /<デプロイ先ディレクトリ>/shared/app/etc/env.php
  • /<デプロイ先ディレクトリ>/shared/app/etc/config.php

env.php

 env.phpはMagento1.xのlocal.xmlに相当するファイルで、Magentoのインストール日時やハッシュキー、データベース接続情報などが書かれています。
開発環境からコピーし、必要な情報をステージに合わせて編集しておきましょう。

config.php

config.phpは有効になっているエクステンションやテーマをリストしたファイルです。
最初のデプロイでは開発環境からコピーしておくのが良いでしょう。

デプロイを実行する

ここまですべての準備が整ったら、以下のコマンドを実行してデプロイを行います。

cap ステージ名 deploy

設定が正しければ、Capistranoが指定したgitリポジトリからファイル一式を取得し、対象のステージにデプロイを行ってくれます。

エラーが出るときは、

cap ステージ名 deploy --trace

とすることで、エラーが出ている場所や内容を知ることができます。

弊社での利用例

弊社では今回ご紹介したcapistrano-magento2に以下のようなカスタマイズを加えて活用しています。

  • Magento用に独自コマンドを追加
  • gitリポジトリ内にVagrantの定義ファイルが同居しているので、Magentoのコードだけをデプロイするように調整
  • その他プロジェクトに合わせた調整を都度実施

おわりに

Magento2は大変にファイル数の多い複雑なアプリケーションです。
本番反映という作業は常にサイトダウンの可能性と隣り合わせですが、避けて通れるものではありません。
Capistranoのような自動化ツールを使うことで、人為ミスを削減し、複数台に対する一斉操作ができるようになります。そうなって初めて短いサイクルでの反映が可能になり、開発者も運営者も安心できるようになります。
ツールを使いこなして、Magentoをより安全に使えるようにしましょう。

明日はkzkick2ndさんによる「独自モジュールのハウツー(仮)」です。よろしくお願いします!