Ruby初心者のCapistranoデプロイ入門

Capistranoを使って、Ruby初心者でもRuby以外のソースコードをデプロイできるようになるまでの流れです。

Rubyもよくわからないし、デプロイツールもろくに使ったことないけど、
Capistranoを使ってコードをデプロイしたい。という人に特に向けた記事です。
私自身そういう人でした。

私の理解不足の部分が多々ありますが、とにかくCapistranoを使ってデプロイができることを目的とします。私は今回の方法で、PHPのコードをデプロイしています。
「もう手動デプロイは嫌だ」「デプロイツール使いたい」「なんかデプロイツール使わないとヤバそう」と思っている方々にとってちょうどいい記事になればいいなと。

Capistranoデプロイができるまで(目次)

  • Capistranoってどういうもの
  • デプロイの流れの概要
  • デプロイ先サーバーとの接続条件
  • Ruby、RubyGemsのインストール
  • Capistranoのインストール
  • デプロイ定義ファイルテンプレートの作成
  • デプロイ環境別ファイルの作成
  • デプロイ定義ファイルの内容
  • デプロイ先ディレクトリの初期化
  • デプロイの実行
  • デプロイのロールバック
  • 今回の使用コマンドまとめ
  • デプロイ定義ファイルの内容が全然読めない場合
  • 参考記事

Capistranoってどういうもの

Capistranoは、同時に複数のサーバ上でスクリプトを実行できるツールで、デプロイツールと呼ばれるものの一つです。Python製のFabricも有名です。
このあたりの情報は、「デプロイツール」で検索してもらえれば沢山見つかります。

マニュアルはこちら。私は殆ど読んでませんが。
https://github.com/capistrano/capistrano/wiki

Capistranoの詳細な仕様などは、WEB上に良質な記事が多くあるのでそちらに頼らせていただくとして、とにかくPHPのデプロイが出来る環境を構築していきます。

デプロイの流れの概要

図にあるように、Capistranoはデプロイ元環境にのみインストールすればOKです。
デプロイ先サーバーにインストールする必要はありません。
capistranoを使ったデプロイのイメージ

デプロイ先サーバーとの接続条件

Capistranoでデプロイを行うためには、デプロイ先サーバーにSSH接続できる必要があります。

Capistranoを使った自動化を行うためには、2つの条件を満たす必要があります。1つはCapistranoをインストールしたマシンからSSH接続可能なことであり、もう1つは同時に実行するサーバのユーザー/パスワードが同じであること、もしくは鍵ファイルを用いたパスワードなしの接続が可能になっている必要があります。このとき、不正ログインを防ぐためパスワードは適切に管理する必要があり、公開鍵認証による運用が推奨されています。まとめてたくさん処理したい! を解決する「Capistrano」

 

Ruby、RubyGems環境のインストール

この二つはインストールしておいてください。

  • Ruby
  • RubyGems(Ruby言語用のパッケージ管理システム)

CapistranoはRubyのプログラムなので、当然Rubyのインストールが必要です。
CapistranoをインストールするためにRubyGemsが必要です。

インストールの詳細は、WEB上に分かりやすい記事が山ほどあるので、そちらをご参考ください。
私はRVM(Ruby Version Manager)を使ってインストールしました。
現在Rubyの最新バージョンは2.0.0(1.9系なら1.9.3)で、RVMを使うとこれらが簡単にインストールできるためです。
yumやapt-getだと、最新バージョンが簡単にインストールできなかったという単純な理由です。

Capistranoのインストール

RubyGemsを使ってCapistranoをインストールします。

$ sudo gem install capistrano
$ sudo gem install capistrano_colors
$ sudo gem install capistrano-ext
$ sudo gem install railsless-deploy
capistrano
Capistrano本体
capistrano_colors
Capistranoの出力に色をつける
capistrano-ext
デプロイ先の環境を切り替えられる
railsless-deploy
Rails以外のアプリケーションのデプロイに使う(特に意識していませんが一応)

sudoではPATH環境変数を引き継がないらしく、
上記コマンドが成功しないかもしれません。その場合は、

$ PATH=$PATH sudo gem install [Gemパッケージ名]

としてみると成功するかと思います。
これは一例で、要はPATHが引き継げればいいので、他にもいろいろ方法はあります。

デプロイ定義ファイルの作成

まずはデプロイ定義ファイルの作成が必要です。
capifyコマンドを使って、デプロイ定義ファイルのテンプレートを作成します。
作成したいディレクトリに移動してから、以下コマンドを実行します。

$ capify .

これでデプロイ定義ファイルのテンプレートが作成されました。

ディレクトリ構成

.
├── Capfile
└── config
       └── deploy.rb

デプロイ環境別ファイルの作成

デプロイ先を本番環境と開発環境で分けるために、capistrano-extをインストールしています。
capistrano-extの標準のディレクトリ形式に則って、デプロイ環境別のファイルを配置します。
標準では、deploy.rbと同階層のdeployディレクトリ配下に作成します。

ディレクトリ構成

.
├── Capfile
└── config
       ├── deploy
       │     ├── development.rb
       │     └── production.rb
       └── deploy.rb

デプロイ定義ファイルの内容

Capfile

load 'deploy'
# Uncomment if you are using Rails' asset pipeline
# load 'deploy/assets'
load 'config/deploy' # remove this line to skip loading any of the default tasks

deploy.rb

require "capistrano/ext/multistage"

ssh_options[:forward_agent] = true
set :normalize_asset_timestamps, false
set :use_sudo, true

# バージョン管理
set :scm, :git
# Gitリポジトリ
set :repository, [GitリポジトリのURL等]
# Gitブランチ
set :branch, :master
# デプロイ方式
set :deploy_via, :copy

# デプロイ対象外ファイル
set :copy_exclude, [".git", ".gitignore"]

namespace :deploy do
  before "deploy" do
    try_sudo "chown -R root:[デプロイユーザーが所属するグループ] #{deploy_to}"
  end
end

デプロイ定義の基本となるファイルです。
デプロイ方式(:deploy_via)を”:copy”と指定しているため、
gitリポジトリから最新バージョンをチェックアウトしてからデプロイ先にコピーします。

deploy/production.rb

# アプリケーション名
set :application, [アプリケーション名]
# デプロイ先ディレクトリ
set :deploy_to, "/path/to/deploy/#{application}"

# デプロイサーバー
role :web, [WEBサーバー1のホスト名]
role :web, [WEBサーバー2のホスト名]
role :app, [APPサーバー1のホスト名] # 無くても大丈夫そう
role :app, [APPサーバー2のホスト名] # 無くても大丈夫そう
role :db, [DBマイグレーションホスト名], :primary => true # 無くても大丈夫そう

production環境用のデプロイ定義ファイルです。
deploy.rbの内容に、production環境固有の情報を追加する形になります。
WEBサーバーを2つ定義しており、この2つのサーバーに対して同時にデプロイ作業が行われます。

deploy/development.rb

# アプリケーション名
set :application, [アプリケーション名]
# デプロイ先ディレクトリ
set :deploy_to, "/path/to/deploy/#{application}"

# デプロイサーバー
role :web, [WEBサーバーのホスト名]
role :app, [APPサーバーのホスト名] # 無くても大丈夫そう
role :db, [DBマイグレーションホスト名], :primary => true # 無くても大丈夫そう

development環境用のデプロイ定義ファイルです。
deploy.rbの内容に、development環境固有の情報を追加する形になります。

デプロイ先ディレクトリの初期化

デプロイ先サーバーに、capistranoのデプロイディレクトリを作成します。

$ cap development deploy:setup

作成されたディレクトリ

.
|-- releases
`-- shared
    |-- log
    |-- pids
    `-- system

releases配下に、ソースコードが世代別にデプロイされていきます。
shared配下には、世代間で共通して保持するデータを置く場所のようですが、
今回は特に意識していません。

環境を指定しない場合

capistrano-extを使っているため、環境を指定してなければ実行されません。

$ cap deploy
triggering load callbacks
triggering start callbacks for `deploy'
* 2013-06-17 13:21:34 executing `multistage:ensure'
No stage specified. Please specify one of: development (e.g. `cap development deploy')
$

ですが、デフォルト環境を設定すれば実行可能です。
興味があれば調べてみてください。

デプロイの実行

デプロイ先サーバーに、ソースコードをデプロイします。

$ cap development deploy

ディレクトリ構成

.
|-- current -> /path/to/deploy/application/releases/20130701003833
|-- releases
|    `-- 20130701003833
|         `-- [ソースコード群]
`-- shared
    |-- log
    |-- pids
    `-- system

releases配下に世代別のソースコードディレクトリがデプロイされると同時に、
currentというシンボリックリンクが作成されます。
今後デプロイを重ねるたびに、currentの指し示すリンク先が最新のものに切り替わっていくという寸法です。
deploy:rollback を実行すると、currentの指し示すリンク先が1世代前に切り替わるわけです。

WEBサーバー側設定

本来事前にやっておくべきことですが、記事の流れの都合上、ここでDocumentRootの設定を行います。
先述のcurrentというシンボリックリンクが、最新のソースコードを指し示すわけなので、
Capistranoを利用する場合は、このcurrentディレクトリ内の(public)ディレクトリをhttpd.conf(またはapache2.confなど)のDocumentRootに設定することになります。
設定例ではcurrent直下のpublicをDocumentRootにしてありますが、適宜読み替えてください。

設定例

DocumentRoot /path/to/deploy/application/current/public

デプロイのロールバック

デプロイを取り消して元の状態に戻したい場合があると思います。
deploy:rollbackを実行すると直前のデプロイを取り消して、1世代前の状態に戻すことができます。
先程も書きましたが、currentの指し示すリンク先を1世代前に切り替えることで、ロールバックを実現しています。

$ cap development deploy:rollback

このコマンドを実行することで、以下のように、
releases配下の最新ソースコードが削除され、currentの指し示す先も1世代前に戻ります。

ロールバック前のディレクトリ構成

.
|-- current -> /path/to/deploy/application/releases/20130701005039
|-- releases
|   |-- 20130701003833
|   `-- 20130701005039
`-- shared
    |-- log
    |-- pids
    `-- system

ロールバック後のディレクトリ構成

.
|-- current -> /path/to/deploy/application/releases/20130701003833
|-- releases
|   `-- 20130701003833
`-- shared
    |-- log
    |-- pids
    `-- system

今回の使用コマンドまとめ

今回使用したcapistranoのコマンドは以下の通りです。
これ以外にも様々なコマンドがありますが、とりあえずこれだけ使えれば、PHPソースコードのデプロイに支障は無いです。
(他のプログラミング言語でも同じではないかなと)
他のコマンドは、必要に応じて運用しながら覚えていけばいいかと。

  • capify
  • cap deploy:setup
  • cap deploy
  • cap [環境名] deploy
  • cap deploy:rollback

デプロイ定義ファイルの内容が全然読めない場合

当然Rubyが読めなければ始まりませんが、DSLの理解も必要になります。
本来マニュアルを読めば分かるはずですが、
全部英語で辛いという場合は、RakeのDSLに似ているらしいので、
「Rake DSL」で調べれば日本語説明も見つかり、ある程度理解できるかと思います。

参考記事

主にこちらの記事を参考にさせていただきました。ありがとうございます。

Fukuoka.php Vol.6でCapistranoについて話しました
CakePHP2アプリケーションをCapistranoでデプロイする
はじめてのCapistrano
Capistranoでデプロイする

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Post Navigation