capistranoで自動デプロイを実行する

プロジェクトは参画するメンバーの人数が多くなるにつれて自動化がボディーブローのように効果を現します。それも工数削減という効果で現れてくるため非常に重要です。

しかし、プロジェクトのキックオフの時には「自動化はそのうち…」となるのも世の常です。まだ見ぬシステムの未来を想像し自動化することはそのときにはあまりにも無意味に思えるからです。

私が現在参画しているプロジェクトも終盤にさしかかっているはずです。(ひょっとしたら中盤かもしれませんが…)メンバーも10名を超える人数になろうかという状況で、自動化を行うことで書くメンバーの作業が円滑に進むことを確認できるようになりました。

ここまで実施してきたことは主にJenkins周りのことでした。テストの自動化やビルドセットの作成、一部APIサーバーの自動デプロイなど。ただ、今後は開発→テスト→Seleniumでのテスト→自動デプロイという流れをステージングレベルでは構築できないかと考えています。

そこで登場するのがcapistranoです。capistranoを利用することで、「gitからcloneしたファイルをデプロイする」とか「Jenkinsでテストが終了したらファイルをデプロイする」といったことができそうです。

ここまではできそうだということを理解したのですが、具体的にどのように実行すればよいのかについてはまだまだ検証中です。今のところ、clone済みのソースコードを指定したSSHを使用して対象のサーバーへデプロイすることができるということは確認しました。そのときの手順を簡単にまとめました。

※以下の内容は主に パーフェクトRuby (PERFECT SERIES 6) の 14-2 capistrano を参考に設定しました。capistranoについて体系立てた説明があまりなかったのでとても参考になりました。

今回利用した環境

今回利用した環境は以下の通りとなります。

  1. capistrano実行環境:mac OS X(10.9.2)
  2. capistrano:2.12.0
  3. Ruby:2.0.0
  4. デプロイ環境: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 (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

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