Capistrano3でWordPressのデプロイをしてみる

Capistrano3を使って、自ホストに最新版のWordPressをデプロイしてみたのでその手順をログとして残しつつ、デプロイツール「Capistrano」の理解を進めていこうと思います。 事前準備として、デプロイ用の環境をAmazonEC2にt2.microインスタンスとしてラウンチして、WordPressが動作する環境(Apache+MySQL+PHP)、Rubygem(とRVM)、そしてCapistrano3のインストールまで出来ている状態で記載しています(この辺の事前準備の手順も後日TIPSとしてまとめたいと思っていますが、今回は省略します)。

さて、早速手順に入ります。 はじめに、デプロイプロジェクト用のディレクトリを作成して、Capistranoをインストールします。

$ cd ~
$ mkdir test-project
$ cd test-project
$ cap install STAGES=test
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/test.rb
mkdir -p lib/capistrano/tasks
Capified

Capistrano3ではマルチステージデプロイ機能がデフォルトでONになっているので、単にcap installを行っただけだと、productionステージとstagingステージが作成されてしまいます。 今回はテスト用に自分のローカルホストのみを対象にデプロイを試すので、testステージのみのプロジェクトを環境変数STAGESの引数に指定します1

次にCapistranoの初期設定を行います。必要ならば、プロジェクトディレクトリ直下に作成されたCapfileを編集します。

$ vim Capfile

今回はrvmやrbenvをデプロイに使わないので、編集項目はありません2

続いて、デプロイ環境(サーバ)の設定を行うため、config/deploy/test.rbを編集します。

$ vim config/deploy/test.rb
----
role :app, %w{deploy@localhost}
role :web, %w{deploy@localhost}
role :db, %w{deploy@localhost}

set :ssh_options, {
  keys: %w(/home/deploy/.ssh/id_rsa),
  forward_agent: true,
}

そして、config/deploy.rbにデプロイ内容を設定します。

$ vim config/deploy.rb
----
# config valid only for Capistrano 3.1
lock '3.2.1'

# デプロイするアプリケーション名
set :application, 'wordpress'

# 最新版のWordPressコアファイルの配布元urlとファイル名
set :wget_url, 'http://ja.wordpress.org/'
set :wget_file, 'latest-ja.tar.gz'

# テーマファイル配布元のgithubのurl(任意で)
#set :repo_url, 'git@example.com:me/my_repo.git'

# デプロイするgithubリポジトリのブランチ名(任意で)
#set :branch, 'master'

# データベース管理アカウント(ユーザーおよびデータベース作成権限があるユーザー)
set :db_user, 'root'
set :db_user_passwd, 'password'

# WordPress用データベース情報(なければ作成する)
set :wp_db_name, 'wp_test_db'
set :wp_db_user, 'wp_user'
set :wp_db_user_passwd, 'wp_user_pass'
set :wp_db_prefix, 'test_'

# デプロイ先はドキュメントルート
set :deploy_to, '/var/www/html'

# バージョン管理はgitで行う
#set :scm, :git

# Default value for :format is :pretty
set :format, :pretty

# ログ出力レベルはデバッグモードに指定
set :log_level, :debug

# Default value for :pty is false
# set :pty, true

# Default value for :linked_files is []
set :linked_files, %w{config/database.yml}

# Default value for linked_dirs is []
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system public/assets}

# Default value for default_env is {}
# set :default_env, { path: "/opt/ruby/bin:$PATH" }

# 世代管理の世代数。今回は2世代管理とする
set :keep_releases, 2

# Capistranoデフォルトのタスクを削除する
framework_tasks = [:starting, :started, :updating, :updated, :publishing, :published, :finishing, :finished]
framework_tasks.each do |t|
  Rake::Task["deploy:#{t}"].clear
end
Rake::Task[:deploy].clear


desc 'Deploy the WordPress site'
task :deploy do
  on roles(:web) do
    # WordPress公式サイトから最新版のWordPressをダウンロードして、ホームディレクトリにアーカイブを展開する
    deploy_log = capture "wget #{fetch(:wget_url)}#{fetch(:wget_file)}; tar -zxvf #{fetch(:wget_file)}"
    archive_dirname = fetch(:wget_file).gsub(/.tar.gz/, '')

    # ダウンロードしたWordPressの全ソースをドキュメントルートにコピーする
    # ※ ドキュメントルートにデプロイユーザが書き込める権限が必要
    deploy_log = capture "cp -fpr #{fetch(:application)}/* #{fetch(:deploy_to)}"

    # WordPressの設定ファイルがなければ作成する
    wp_config = fetch(:deploy_to)+"/wp-config.php"
    unless test "[ -f #{wp_config} ]"
      execute "mv #{fetch(:deploy_to)}/wp-config-sample.php #{wp_config}"
    end
    # パーマリンクrewrite用の.htaccessがなければ作成して書き込み権限を与える
    htaccess = fetch(:deploy_to)+"/.htaccess"
    unless test "[ -f #{htaccess} ]"
      execute "touch #{htaccess}; chmod a+w #{htaccess}"
    end

    # ホームディレクトリに残ったアーカイブディレクトリを削除する
    deploy_log = capture "rm -rf #{fetch(:application)}"
    info deploy_log
  end
end

実際にデプロイしてみる。

DEBUG[a7ae646a] Running /usr/bin/env wget http://ja.wordpress.org/latest-ja.tar.gz; tar -zxvf latest-ja.tar.gz on localhost
DEBUG[a7ae646a] Command: wget http://ja.wordpress.org/latest-ja.tar.gz; tar -zxvf latest-ja.tar.gz
~ (中略) ~
DEBUG[a7ae646a] Finished in 3.837 seconds with exit status 0 (successful).
DEBUG[d19f20d5] Running /usr/bin/env cp -fpr wordpress/* /var/www/html on localhost
DEBUG[d19f20d5] Command: cp -fpr wordpress/* /var/www/html
DEBUG[d19f20d5] Finished in 0.150 seconds with exit status 0 (successful).
DEBUG[dd0f38a4] Running /usr/bin/env [ -f /var/www/html/wp-config.php ] on localhost
DEBUG[dd0f38a4] Command: [ -f /var/www/html/wp-config.php ]
DEBUG[dd0f38a4] Finished in 0.102 seconds with exit status 1 (failed).
INFO[35f0bcff] Running /usr/bin/env mv /var/www/html/wp-config-sample.php /var/www/html/wp-config.php on localhost
DEBUG[35f0bcff] Command: mv /var/www/html/wp-config-sample.php /var/www/html/wp-config.php
INFO[35f0bcff] Finished in 0.102 seconds with exit status 0 (successful).
DEBUG[822f4fb0] Running /usr/bin/env [ -f /var/www/html/.htaccess ] on localhost
DEBUG[822f4fb0] Command: [ -f /var/www/html/.htaccess ]
DEBUG[822f4fb0] Finished in 0.107 seconds with exit status 0 (successful).
DEBUG[25219b94] Running /usr/bin/env rm -rf wordpress on localhost
DEBUG[25219b94] Command: rm -rf wordpress
DEBUG[25219b94] Finished in 0.111 seconds with exit status 0 (successful).
INFO

上記のようなログが出力され、ドキュメントルートへの最新版WordPressのソース展開まで成功しました。 今回はここまで。次回はデータベースの作成や初期設定を直前タスクとして挿入して、さらにWordPressの設定ファイルの書き換え、GitHubからWordPressテーマをダウンロードするところまでやってみようと思います。

参考サイト


  1. もし複数ステージが必要な場合は、カンマ区切りで引数を指定します。 

  2. 必要に応じてrbenvやbundlerなどデプロイする環境にあわせてGemfileをrequireしておきます。