Capistrano3を使ってみた

今月頭くらいからちょくちょく触っているCapistrano3
アプリケーションの自動デプロイができたのでまとめてみます。
1日に何回もデプロイする環境では、重宝するCapistranoですが、
ググってみるとハマってる人がそこそこ多い感じ。
一通り触ってみて、やっぱり学習コストはちょっと高い気がするけど、
得られるメリットは大きいなあと思いました。

Capistrano3

  • デプロイ自動かのためのフレームワーク
  • Ruby製
  • cap deployという呪文を唱えるだけでアプリケーションのデプロイからアプリケーションサーバの再起動までやってくれる優れもの
  • 対象のホストにsshkitを使ってログインして各種コマンドを発行する
  • Web,AP,DBなど用途ごとにホストを分けて運用している場合でも、roleに記載すればそこでコマンドを実行してくれる。

インストール

$ gem install capistrano
$ gem install capistrano-rails
$ gem install capistrano-rbenv
$ gem install capistrano-bundler
$ gem install capistrano3-unicorn
$ gem install capistrano3-ridgepole
$ gem install capistrano-rails-console
$ gem install capistrano3-delayed-job

セットアップ

$ mkdir testdeploy
$ cd testdeploy
$ cap install

ここまで入力するだけで必要なディレクトリやファイルが生成されます。
cap installはデフォルトではproductionとstagingが生成されますが、
productionでしか実行しないよって人はcap install STAGES=productionとオプションつけて実行してあげたらOKです。
develop,staging,production全部必要というのであればcap install STAGES=development,staging,productionと書けばOKです。
下記は実際に生成されたディレクトリやファイルです。
余談ですが、treeコマンドを使うと一発で下記のようなツリーが作れるので便利です。

/home/rails/testdeploy
├── Capfile
├── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
└── lib
    └── capistrano
            └── tasks

今回使うのは、Capfile,config/deploy.rb,config/deploy/production.rbの3つのファイルです。

各ファイルの設定

Gistに置いてますので、参考にしてください。

Capfile

Capistranoを実行するプラグインをrequireしている。

config/deploy.rb

deploy.rbの4行目あたりにset :repo_url, 'git@gh-328-hogehoge:328/hogehoge.git'と記述していて、
gh-328-hogehogeはGithub本来のアドレスではなく、
~/.ssh/configに記載しているgithub.comのエイリアス名である。

Host gh-328-enterprise
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/328deploy
  TCPKeepAlive yes
  IdentitiesOnly yes

この辺に詳しく無い人は、まず下記のサイトを見て実際に~/.ssh/configを書いてみるといいかもしれない。

  • ~/.ssh/config で簡単に複数ホストへのSSH接続を管理する - すぱぶろ
    なぜ、「Host名をわざわざ書き換えているか」なんですけども
    例えば、同じサーバ上で2つのプロジェクトをデプロイしなければならない かつ デプロイキーが分かれている場合、
    ソースを取得しに行くアドレスは一緒でも参照する秘密鍵が変わってしまう。
    そこで、下記のように~/.ssh/configを記述しておけば、エイリアスされた名前でアクセスするだけで参照する秘密鍵を変更することができる。
Host gh-328-enterprise
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/328deploy
  TCPKeepAlive yes
  IdentitiesOnly yes

Host gh-328-software
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/328software
  TCPKeepAlive yes
  IdentitiesOnly yes

デプロイキーの設定については下記が参考になると思います。

21行目にはset :linked_filesには、databaseそのサーバー固有の設定やgitで管理しないファイルを記述する。
例えば、パスワードやアクセス先がベタ書きされているようなdatabase.ymlなどはgitで管理しない場合が多いので、別途デプロイする必要がある。
ここで設定したファイルはsharedディレクトリに事前に入れておけばシンボリックリンクを作成してくれる。

24,25行目はunicornの設定で、set :unicorn_pidはUnicornのpidファイルの置き場をセットする。shared_pathに設定しておくことを推奨する。
set :unicorn_config_pathは、unicorn.rbの設定ファイルの置き場をセットする。大抵はプロジェクトの中に入っているので、release_pathを設定する。

26~29行目は、ridgepoleの設定を記載する。特にパスの記述は注意する。

31行目以降はdeployが完了した後に実行するタスクを記述する。
unicornの再起動とridegepoleの実行を行っている。

production.rb

4行目のset :bundle_pathでは、bundle installされるファイルたちを全てプロジェクト内のvendor/bundleにインストールしている。
1つのサーバで1つのアプリケーションを動かすのであれば、他にもやり方はあるけど
1つのサーバで複数のアプリケーションを動かす場合は、
ライブラリのバージョンの関係もあってrbenv共通のディレクトリに置けないこともあってそっちにインストールしている。

今回、全部のroleがlocalhostにあるので,serverをlocalhostに設定している。
Capistranoはlocalhostでもリモートでもsshを実行するので、鍵の設定が必要になる。
実はlocalyオプションもあるのだけれど、
今後、ホストを分けていく予定があったので、localyオプションを利用せず
localhost用の鍵ペアを作って~/.ssh/authorized_keysに登録して利用している。

実際に実行してみる

$ cap production deploy

これだけでデプロイまで持っていけるようになる。
どっかでこけた場合はcap production deploy --traceと、--traceオプションをつけて原因を探ってみると良いかも。
書き足りないところがありそうなので、気づいたら編集していきます。

参考にしたサイト