今月頭くらいからちょくちょく触っている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
オプションをつけて原因を探ってみると良いかも。
書き足りないところがありそうなので、気づいたら編集していきます。