[CentOS6] Subversion+Capistrano でリリースを自動化してみる ~ 2.テスト環境設定


Create: 2013/07/03
LastUpdate: 2013/07/04
≪ メニューに戻る

2.テスト環境設定


ここでは、「 1.サーバ構築」で作成したサーバをテストするために、テスト用のWEBアプリケーション(PHP)を用意して、Subversionのレポジトリに登録し、リリース時の作業をCapistarno のタスクとして定義します。

2.1.WEBアプリケーションの作成


今回は、テスト用にPHPアプリを1ファイルだけ用意します。内容は以下のとおり。ファイル名は "phpinfo.php" とします。
<?php
 /**
  * PHPINFO
  *
  * PHP versions 5
  *
  * @category CategoryName
  * @package  PacageName
  * @author   Author <username@example.com>
  * @license  http://www.php.net/license/3_0.txt  PHP License 3.0
  * @link     http://example.com/
  */

 phpinfo();

?>
phpcs で構文チェックをしてエラーがないことを確認します。
# phpcs phpinfo.php
Time: 0 seconds, Memory: 4.00Mb

2.2.subversionのレポジトリ作成


Subversion のレポジトリを作成し、以下のようなディレクトリ構成で管理することにします。
  • trunk ・・・ 開発中のコードを管理する。(メイン)
  • tags ・・・ リリースするコードを管理する。変更しない。
  • branches ・・・ リリースしたコードの保守
上記2.1で作成した WEBアプリケーション用を "project1" の名称で管理することにします。
以下のようコマンドを実行して、"project1" 用にレポジトリを作成します。
# svnadmin create /home/svn/project1
上記2.1で作成した WEBアプリケーションを trunc にインポートします。
# cd /var/www/html/project1
#  svn import file:///home/svn/project1/trunc -m 'Initial import'
branches ディレクトリを作成します。
# svn mkdir file:///home/svn/project1/branches -m 'setup'
tags ディレクトリを作成します。
# svn mkdir file:///home/svn/project1/tags -m 'setup'
レポジトリをHTTPで公開するので、Apacheから読み書きできるように所有者を変更します。
# chown -R apache.apache /home/svn/project1
ブラウザで以下のURLにアクセスして、レポジトリの内容を確認します。
  • http://<IPアドレス>/repos/project1/ 
下図のようにディレクトリが3つ表示されます。



trunc をクリックすると下図のとおり。WEBアプリケーションが登録されていればOKです。



2.3.Capistrano のタスク作成


リリース時に行う作業をCapistrano のタスクとして定義します。作成するタスクは以下のとおり
  • チェックアウト
  • 受け入れチェック
  • リリース
  • デプロイ(チェックアウト、受け入れチェック、リリースを実行)
  • リリースチェック
  • 切り戻し
タスクは、/root/workspace/project1.cap ファイルに定義することにします。
内容は、以下のとおり。role の web で定義したWEBサーバ2台に対してリリースを行います。
#
# リリース
# project1
#

# 基本定義

set :app_name,      "project1"                       # アプリ名
set :user,          "root"                           # sshユーザー
set :password,      "password"                       # sshパスワード
set :svn_repo,      "file:///home/svn/project1/tags" # svnのリポジトリパス
set :svn_tag,       "rel-0.0.0"                      # チェックアウト対象
set :checkout_dir,  "/home/unyo/workspace/project1"  # チェックアウトしたソースを置く場所
set :deploy_dir,    "/var/www/project1"              # ファイルを設置する場所
set :deploy_bk_dir, "/var/www/bk"                    # バックアップを置く場所
set :deploy_user,   "apache"                         # ファイルの所有者(user)
set :deploy_group,  "apache"                         # ファイルの所有者(group)

# サーバ定義
# すべてのサーバは、同じSSHユーザ、パスワードで接続します。

role :local, "localhost"                             # ローカルホスト
role :web, "192.168.1.61","192.168.1.66"             # リリース先のWEBサーバ

#--------------------------
# タスク:チェックアウト
#--------------------------
desc "チェックアウト"
task :u_checkout, :roles => [:local] do
    # レポジトリからエクスポート
    run "rm -rf #{checkout_dir}"
    run "svn export #{svn_repo}/#{svn_tag} #{checkout_dir}"

    # リリース番号の保存
    run "echo '#{svn_tag}' > #{checkout_dir}/Release"
end

#--------------------------
# タスク: 受け入れチェック
#--------------------------
desc "受け入れチェック(phpcs)"
task :u_phpcs, :roles => [:local] do
    # 構文チェック
    run "phpcs --standard=PHPCS #{checkout_dir}/*.php"
end

#--------------------------
# タスク: リリース
#--------------------------
desc "リリース"
task :u_upload, :roles => [:web] do
    # バックアップ
    run "mkdir -p #{deploy_bk_dir}"
    run "rm -f #{deploy_bk_dir}/#{app_name}.tgz"
    run "if [ -d #{deploy_dir} ] ; then tar cvfzP #{deploy_bk_dir}/#{app_name}.tgz #{deploy_dir} ; fi"

    # ディレクトリ送信
    run "rm -rf #{deploy_dir}"
    upload("#{checkout_dir}", "#{deploy_dir}", :via => :scp, :recursive => true)

    # 所有者変更
    run "chown -R #{deploy_user}:#{deploy_group} #{deploy_dir}"
end

#--------------------------
# タスク: デプロイ
#--------------------------
desc "デプロイ"
task :u_deploy, :roles => [:local] do

    u_checkout
    u_phpcs
    u_upload

end

#--------------------------
# タスク: リリース・チェック
#--------------------------
desc "リリース・チェック"
task :u_relcheck, :roles => [:web] do

    run "cat #{deploy_dir}/Release"

end

#--------------------------
# タスク: 切り戻し
#--------------------------
desc "切り戻し"
task :u_restore, :roles => [:web] do
    run "test -e #{deploy_bk_dir}/#{app_name}.tgz"
    run "rm -rf #{deploy_dir}"
    run "tar xvfzP #{deploy_bk_dir}/#{app_name}.tgz"
end

このファイルで定義したタスクは、運用管理サーバに root ユーザでログインして実行します。
以下のように実行すると、タスク一覧を見ることができます。
# cap -T -f /root/workspace/project1.cap
cap invoke     # Invoke a single command on the remote servers.
cap shell      # Begin an interactive Capistrano session.
cap u_checkout # チェックアウト
cap u_deploy   # デプロイ
cap u_phpcs    # 受け入れチェック(phpcs)
cap u_relcheck # リリース・チェック
cap u_restore  # 切り戻し
cap u_upload   # リリース

Extended help may be available for these tasks.
Type `cap -e taskname' to view it.
各タスクは、以下のように実行します。
エラーがある場合は、終了コード(ex. Bashの場合は $? )に 0 以外の値が設定されます。

(1) チェックアウトの場合

svn_tag にチェックアウトするタグ名を指定します。
# cap -s svn_tag=rel-1.0.0 -f /root/workspace/project1.cap u_checkout

(2) 受け入れチェックの場合

拡張子が、”.php" のファイルについては、PHPの構文チェックを行います。
# cap -f /root/workspace/project1.cap u_phpcs

(3) リリースの場合

WEBサーバ上のWEBアプリケーションをバックアップしてからリリースします。
# cap -f /root/workspace/project1.cap u_upload

(4) デプロイの場合

上記(1)、(2)、(3)を実行します。
# cap -s svn_tag=rel-1.0.0 -f /root/workspace/project1.cap u_deploy

(5) リリースチェックの場合

WEBサーバ上のWEBアプリケーションのリリース番号を表示します。
# cap -f /root/workspace/project1.cap u_relcheck

(6) 切り戻しの場合

バックアップを戻します。
# cap -f /root/workspace/project1.cap u_restore