プロジェクトは参画するメンバーの人数が多くなるにつれて自動化がボディーブローのように効果を現します。それも工数削減という効果で現れてくるため非常に重要です。
しかし、プロジェクトのキックオフの時には「自動化はそのうち…」となるのも世の常です。まだ見ぬシステムの未来を想像し自動化することはそのときにはあまりにも無意味に思えるからです。
私が現在参画しているプロジェクトも終盤にさしかかっているはずです。(ひょっとしたら中盤かもしれませんが…)メンバーも10名を超える人数になろうかという状況で、自動化を行うことで書くメンバーの作業が円滑に進むことを確認できるようになりました。
ここまで実施してきたことは主にJenkins周りのことでした。テストの自動化やビルドセットの作成、一部APIサーバーの自動デプロイなど。ただ、今後は開発→テスト→Seleniumでのテスト→自動デプロイという流れをステージングレベルでは構築できないかと考えています。
そこで登場するのがcapistranoです。capistranoを利用することで、「gitからcloneしたファイルをデプロイする」とか「Jenkinsでテストが終了したらファイルをデプロイする」といったことができそうです。
ここまではできそうだということを理解したのですが、具体的にどのように実行すればよいのかについてはまだまだ検証中です。今のところ、clone済みのソースコードを指定したSSHを使用して対象のサーバーへデプロイすることができるということは確認しました。そのときの手順を簡単にまとめました。
※以下の内容は主に パーフェクトRuby (PERFECT SERIES 6) の 14-2 capistrano を参考に設定しました。capistranoについて体系立てた説明があまりなかったのでとても参考になりました。
今回利用した環境
今回利用した環境は以下の通りとなります。
- capistrano実行環境:mac OS X(10.9.2)
- capistrano:2.12.0
- Ruby:2.0.0
- デプロイ環境:CentOS6.4
capistranoは最新版が3系となっていますので注意してください。2系でも目的は果たせると思いますのでこちらから始めてみる方がよいように思います。
capistranoのインストール
capistranoのインストールはgemをインストールするだけですので簡単です。が、今回利用した2.12.0では net-ssh のバージョンが原因でsshから接続が正常に行えませんでした。(Net::SSH::AuthenticationFailed: Authentication failed for user ... が発生してログインできません。)
$ cap hello_capistrano * executing `hello_capistrano' * executing "echo "Hello, Capistrano!"" servers: ["192.168.10.150"] connection failed for: 192.168.10.150 (Net::SSH::AuthenticationFailed: Authentication failed for user beaglesoft@192.168.10.150) $ gem list | grep capistrano capistrano (2.12.0) $ gem list | grep net-ssh net-ssh (2.8.0) net-ssh-gateway (1.2.0)
エラーとなったバージョンは以下の通りです。
- capistrano:2.12.0
- net-ssh:2.8.0
- net-ssh-gateway:1.2.0
その後、net-ssh のバージョンを 2.6.5 へ変更することで正常に動作しました。
$ gem uninstall net-ssh You have requested to uninstall the gem: net-ssh-2.8.0 capistrano-2.12.0 depends on net-ssh (>= 2.0.14) net-scp-1.1.2 depends on net-ssh (>= 2.6.5) net-sftp-2.1.2 depends on net-ssh (>= 2.6.5) net-ssh-gateway-1.2.0 depends on net-ssh (>= 2.6.5) sshkit-1.3.0 depends on net-ssh (>= 0) If you remove this gem, these dependencies will not be met. Continue with Uninstall? [yN] y Successfully uninstalled net-ssh-2.8.0 $ gem install net-ssh -v 2.6.5 Fetching: net-ssh-2.6.5.gem (100%) Successfully installed net-ssh-2.6.5 Parsing documentation for net-ssh-2.6.5 Installing ri documentation for net-ssh-2.6.5 1 gem installed
capistranoの初期設定を行う
capistranoを利用するために、あらかじめrailsアプリケーションを作成しました。そのrailsアプリケーションのルートディレクトリで capify コマンドを実行します。実行後、config/deploy.rb ファイルが作成されることを確認します。
config/deploy.rbを編集する
デプロイを行うための設定は config/deploy.rb ファイルに設定します。様々な設定を行えますが、とりあえず容易な方法で現在のプロジェクトを対象のサーバーへデプロイするように設定しました。
set :application, "capi_trial" set :repository, "/Users/beaglesoft/projects/rails_apps/cap_trial" # gitbucketなどを使用する場合はこのように指定する。ただし、公開鍵の対応方法しかわからなかった。 #set :repository, "https://beaglesoft@bitbucket.org/beaglesoft/capistrano_trial.git" # 対象サーバーの設定 set :user, 'beaglesoft' set :password, "password" # コピーでデプロイを実行する # note:scmを使用する場合はremote_cache/checkout/exportのいずれかを指定する set :deploy_via, :copy # コピーでデプロイするため none を指定する # gitを使用する場合は :git とする set :scm, :none # コピーを実行する際に除外するファイルの形式を指定する # svnは余計だが設定しておく set :copy_exclude, [".git", "**/.git", ".DS_Store", ".svn", "**/.svn", "log", "tmp"] # role としてそれぞれのサーバーを指定する role :web, "192.168.10.150" # Your HTTP server, Apache/etc # app は特に指定する必要がない? #role :app, "192.168.10.150" # This may be the same as your `Web` server # dbは冗長構成の場合があるため主となるサーバーを指定する role :db, "192.168.10.150", :primary => true # This is where Rails migrations will run # role :db, "your slave db-server here" # sudo コマンドを指定しないように設定する # note:sudo コマンドを指定する場合は別途設定が必要 set :use_sudo, false # deploy先を指定する set :deploy_to, "/usr/local/apps/#{application}" # deploy コマンドの本体を定義する namespace :deploy do task :go do # ここにはデプロイ処理を記述する end end
上記の設定で、対象となるサーバー(192.168.10.150)へcapistranoが実行されるrailsアプリケーションをデプロイすることが可能となります。
デプロイ実行
デプロイは2段階の処理を行います。
- deploy::setup コマンドでデプロイ先のディレクトリを整備する。
- deploy コマンドでデプロイを実行する。
実際には 2 では deploy --dry-run でテスト実行を行い内容を確認します。実際に実行すると以下の通りデプロイ対象サーバーにファイルがデプロイされます。
$ pwd /usr/local/apps $ ls -l 合計 4 drwxrwxr-x. 4 beaglesoft beaglesoft 4096 11月 21 13:33 2013 capi_trial $ ls -l capi_trial/ 合計 8 lrwxrwxrwx. 1 beaglesoft beaglesoft 50 11月 21 13:33 2013 current -> /usr/local/apps/capi_trial/releases/20140324022431 drwxrwxr-x. 4 beaglesoft beaglesoft 4096 11月 21 13:33 2013 releases drwxrwxr-x. 5 beaglesoft beaglesoft 4096 11月 21 12:42 2013 shared $ ls -l capi_trial/current/ 合計 224 -rw-rw-r--. 1 beaglesoft beaglesoft 269 3月 24 11:24 2014 Capfile -rw-rw-r--. 1 beaglesoft beaglesoft 761 3月 24 11:24 2014 Gemfile ... $ ls -l capi_trial/releases/ 合計 8 drwxr-xr-x. 14 beaglesoft beaglesoft 4096 3月 24 10:54 2014 20140324015414 drwxrwxr-x. 13 beaglesoft beaglesoft 4096 11月 21 13:33 2013 20140324022431 $ ls -l capi_trial/shared/ 合計 12 drwxrwxr-x. 2 beaglesoft beaglesoft 4096 11月 21 12:42 2013 log drwxrwxr-x. 2 beaglesoft beaglesoft 4096 11月 21 12:42 2013 pids drwxrwxr-x. 2 beaglesoft beaglesoft 4096 11月 21 12:42 2013 system
デプロイ先のサーバーには対象となるディレクトリに3つのディレクトリが作成されています。
- release
- current
- shared
何となく内容は理解できますが、この辺をいかに上手に運用するかはもう少し検討が必要です。
ざっと試してみましたが、今日初めてcapistranoの設定をしましたがこの程度のことであれば2時間程度でうまくいきました。これから様々なことを考慮する必要が出てくると思いますがとっかかりとしてはちょうどよかったのではないかと思います。

- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (22件) を見る