Windows端末だけでCapistranoを使う

仕事でRailsを使っていると、IDCセンター等にあるサーバーにDepolyしなくちゃいけないことがままある。こうした時従来と同じ手順書をつくってtarボールを転送して解凍して...としていたのだけど、効率が悪くて仕方が無い。開発環境にあるソース管理サーバーにアクセスできればCapistranoで一発なんだけど、IDCセンターでそんなものにつながる訳もない。

しかも持ち込めるものはWindows端末だけなので、どうにかその環境でCapistranoが使えないか試してみた。

今回試してみた環境は以下のとおり。

3つのサーバーが同一セグメント上にあるのだけれど、導入先のLinuxサーバーとソース管理サーバー間は通信できないものとして処理した

Windows端末側

Windows側は以下の2つの準備が環境としては必要となる。

まずRubyから準備してゆく。Windowsで動作するRubyは幾つかあるけれど、手慣れているInstantRailsをつかってみた。手順的には以下の通り。

  1. InstantRails2.0をダウンロード
  2. 解凍したファイルからrubyフォルダだけを取り出してコピー
  3. 適当な場所(今回はf:\t-tools\ruby)に設置
  4. 設置したruby\binにパスを通す(マイコンピューターを右クリックしてプロパティーを出して、「詳細設定タグ」->「環境変数」を出す。システム環境変数のPATHに加えてもいいし、ユーザ環境変数にPATHを作って追加してもいい)

パスを通しておわったらGemが古いので、Gemをアップデートする(WindowPowerShellかコマンドラインを使う)

>gem update --system
=>gem1.3.1にアップデート

次にCapistranoをインストールする

> gem install capistra
Successfully installed net-ssh-2.0.11
Successfully installed net-sftp-2.0.2
Successfully installed net-scp-1.0.2
Successfully installed net-ssh-gateway-1.0.1
Successfully installed capistrano-2.5.5
5 gems installed

本質的には不要だけれどRailsもインストールしておく(今回はRails2.1系を主に使っているのでそれを入れた)。

> gem install rails --version 2.1.2
Successfully installed activesupport-2.1.2
Successfully installed activerecord-2.1.2
Successfully installed actionpack-2.1.2
Successfully installed actionmailer-2.1.2
Successfully installed activeresource-2.1.2
Successfully installed rails-2.1.2

これでRuby側の準備は完了(一度作って終われば、このRubyフォルダ配下を他の端末にコピーすることで増やす事もできる)。

次にSunversionサーバーをインストールする。

WindowsXP-Pro端末にSubversionを入れる為にhttp://subversion.tigris.org/からリンクが貼られているWindows Binaryをおとしてくる。

幾つかバイナリがあるが、そのなかでCollabNet Subversion サーバー&クライアント v1.5.6 を今回は利用した(ダウンロード時にユーザ登録があるので注意)。

インストールする時に、Windowsのサービスとして起動というチェックボックスがあるので、それをチェックしておくと自動的にSubversionサーバーが起動してくるので便利。

また、インストール中にレポジトリを格納するトップディレクトリを指定するように促されるので、このディレクトリ名は覚えておく(後で作成したレポジトリデータはここで指定してディレクトリ下に格納される為)。

インストールが終了するとまずレポジトリそのものを作る(このあたりはLinuxのコマンドと同じ)。

>svnadmin create レポジトリ名
(例:#svnadmin create svn)

これでレポジトリができる。レポジトリができるとインストール時に設定したディレクトリ配下にここで指定した名前のディレクトリができている。その中のconfディレクトリにあるsvnserver.confを修正する。

初期状態だと非認証ユーザは読み込みだけ、認証ユーザは書き込みも可となっている。ここでは作業用の一時データしか放り込まない前提なので認証をいらない状態で使えるように変えてしまう(Linux側からソースを取得しにくる時に認証が不要になる)。

[general]
### These options control access to the repository for unauthenticated
### and authenticated users.  Valid values are "write", "read",
### and "none".  The sample settings below are the defaults.
# anon-access = read
# auth-access = write
anon-access = write
auth-access = write    

これで認証が不要な状態で使えるようになる。TortoiseSVN等で「svn://IPアドレス/レポジトリ名」と入力して先ほど作ったレポジトリが機能していることを確認する。

これでWindows側の環境準備は完了。

次にソースの準備。本質的な問題は導入先に行った時に普段使っているソース管理サーバーにアクセスできないということなので、Deployしたいソースをソース管理サーバーのSubversionからWindowsXP端末にエクスポートする。

エクスポートで取り出したソースをWindowsXP端末内部ののSubversionレポジトリにインポートする。WindowsXPは192.168.0.134なので、そこにbbs(今回のサンプルシステム名)をつくって、trunkの下にいれてみた。


svn://192.168.0.134/svn/bbs/trunk

これでソースの準備はOK。

サーバー側

Deploy先のLinuxサーバー側だけれど、こちらはたいしたことがいらない。RubyRails,SSH接続、Subversionクライアントが動作していれば大丈夫。後は特殊な設定は何もいらない(Railsを動かすための設定は必要)。ここは大抵の人は分かるだろうからザックリ割愛。Subversionのクライアントがサーバー側にも必須な点だけ注意。

Capistrano準備

WindowsXPSubversionレポジトリにインポートしたソースをWindowsXP内部にチェックアウトしてCapistranoの定義ファイルを作る。

#cd RAILS_ROOT
#capify .
[add] writing `./Capfile'
[add] writing `./config/deploy.rb'
[done] capified!

これで定義ファイルができる。次にdeploy.rbの設定を変更する。

deploy.rbの初期状態は以下の通り

set :application, "set your application name here"
set :repository,  "set your repository location here"

# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"

# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

role :app, "your app-server here"
role :web, "your web-server here"
role :db,  "your db-server here", :primary => true

これを以下のように設定してみた。

アプリケーションは簡単な掲示板を作ってみたのでbbsという名前を割り振ってみた。

set :application, "bbs"
set :repository, "svn://192.168.0.134/svn/bbs/tags/09040101"
role :app, "192.168.0.131"
role :web, "192.168.0.131"
role :db,  "192.168.0.131", :primary => true
set :user, "tgg"
set :deploy_to, "/pub/deploy/bbs"
set :deploy_via, :export
set :use_sudo, false

上記の設定でtggユーザとしてLinuxサーバーにsshで接続して、/pub/deploy/bbs配下に
環境をつくようにと定義してみた。sudoは使わしてもらえないことが多いので、ここ
ではオフにしてある。

ここまで設定ができた時点でWindowsXPからからセットアップを指示してみる

>cd RAILS_ROOT
>cap deploy:setup
  * executing `deploy:setup'
  * executing "mkdir -p /pub/deploy/bbs /pub/deploy/bbs/releases /pub/deploy/bbs/shared /pub/deploy/bbs/shared/system
ub/deploy/bbs/shared/log /pub/deploy/bbs/shared/pids &&  chmod g+w /pub/deploy/bbs /pub/deploy/bbs/releases /pub/deplo
bbs/shared /pub/deploy/bbs/shared/system /pub/deploy/bbs/shared/log /pub/deploy/bbs/shared/pids"
    servers: ["192.168.0.131"]
Password:
    [192.168.0.131] executing command
    command finished

これでLinuxサーバー側にディレクトリが作成される。途中にあるPasswordという場所までくるとssh接続用のパスワードの入力が求められるので、それを入力すれば続行する。

動作確認ができたら、ここまでのソースをcapistranoの定義ファイルが入った状態をSVNにコミットしておく。この状態はtrunkにコミットしただけなので、deploy.rbの定義にあるようにtags配下にタグを作っておく(svn://192.168.0.134/svn/bbs/trunkからsvn://192.168.0.134/svn/bbs/tags/09040101を作った)。

ここまで準備ができたらdeployしてみる


#cap deploy

reaperの設定が無いので再起動に失敗するが、deployそのものは問題なく成功。Linuxサーバーに環境がごっそりできた。

あとは通常のCaspitoranoの設定手順そのままなので、定義を増やしてゆけばいい。

2回目以後は、WindowsXPのタグ側に直接インポートして、それをDeployするのがいいかもしれない。

後は実際の環境で試して実践で使ってみるかな。