Capistrano3でプライベートリポジトリからデプロイする

こんにちは寺岡です。

この記事は TECHSCORE Advent Calendar 2014 の 3 日目の記事です。

それは遥か昔、世界が未だデプロイツールを手に入れる前のお話。

その頃のエンジニアにとって、デプロイは神聖かつ盛大な儀式であった。
儀式には決して破ってはいけない戒律が存在した。
「tar、scp、rakeなどの高度で難解な呪文を駆使し、正しい順序をもって執り行うべし」
戒律は地域、文化、宗教の違いによりさまざまなバリエーションが存在し、儀式の困難さに拍車をかける。
しかし、最後は必ずこう締めくくられるのだ。
「一度呪文を間違えたその時は、大いなる災厄がこの世を襲うであろう」と。

災厄を恐れたエンジニアたちは、長大で重厚な手順書を作り、なんとかデプロイを乗り切ろうとした。
それでもなお、手順書のバグやタイプミスにより悲劇は繰り返されるのであった…。

しかし、度重なる悲劇と切り戻しに疲弊したエンジニアたちに希望の光が現れた。
災厄を見かねて立ち上がった勇者たちが、デプロイに立ち向かう武器を手に帰ってきたのだ。

Capistranoをインストールした勇者たちが cap deploy という呪文を唱えると、たちどころにデプロイが実行されていった。
こうして大いなる災厄は過去のものとなり、世界は平和に包まれたのだ。

 

Capistrano V3 で使えなくなった deploy_via オプション

つい悪乗りしてしょうもない小話を書いてしまいましたが、今回はRailsの鉄板デプロイツール Capistranoのネタを書きます。

Capistranoは元々Railsに特化したデプロイフレームワークとして開発されました。
しかし、2013年にリリースされたv3からはRailsへの依存をなくした汎用的なデプロイツールとなりました。

この際、大幅なアーキテクチャ変更が行われたためv2から削られた機能は少なくありません。
その中のひとつがdeploy_viaオプションです。

このオプションのデフォルトは deploy_via :export で、デプロイ実行時は下記の図のように、
デプロイ先サーバが直接リポジトリのソースをチェックアウトすることになります。

 

Capistrano v2 deploy_via: export

 

LAN にリポジトリが存在する場合は、デプロイ先サーバからリポジトリに直接アクセスする必要があるためデプロイすることができません。
こんな場合はdeploy_via :copy と設定することで、デプロイ元で取得したソースをデプロイ先に転送することができたのです。

 

Capistrano v2 deploy_via: copy

 

しかし、Capistrano v3 ではこの機能が削除されたためLAN上のリポジトリからデプロイするのは難しくなってしまいました。
本稿ではなんとかしてLAN上のプライベートリポジトリからデプロイする方法を検討してみたいと思います。

 

SSH Port Forwarding

ここで一旦話は飛んで、SSHのお話です。

SSHにはポートフォワーディングという機能があります。

以下の様に-Lオプションを指定することで、sshクライアント側のリッスンポートへのアクセスを
SSHトンネルを通ってリモートホスト側のネットワークへ転送することが出来ます。

 

例えば、以下のような状況があったとします。

  • WAN側のapp2サーバは80番ポートをリッスンしている
  • 外部には開放されておらず、同一ネットワークのapp1からしかアクセスできない
  • app1にはdeployからsshでアクセスできる

ここでLAN側のdeployサーバで以下のコマンドを実行すると、deploy:8080を通してapp2:80にアクセスすることが可能になります。

 

SSH PortForwarding

 

SSH Remote Port Forwarding

SSHのポートフォワーディングはsshクライアント側のポートをリッスンし、リモートホスト側のネットワークに転送する機能でした。
これとは逆にリモートホスト側のポートをリッスンし、クライアント側のネットワークに転送する機能も存在します。
これはリモートポートフォワーディングと呼ばれ、-Rオプションで指定することができます。

 

今度は、以下のような状況を考えてみます。

  • LAN側のrepoサーバは80番ポートをリッスンしている
  • 外部には開放されておらず、同一ネットワークのdeployからしかアクセスできない
  • app1にはdeployからsshでアクセスできる

この場合、LAN側のdeployサーバで以下のコマンドを実行すると、app1:8080を通してrepo:80にアクセスすることが可能になります。

 

SSH RemotePortForwarding

 

 

Capistrano v3 で SSH Remote Port Forwarding

そろそろオチが見えてきましたね。
そう、CapistranoのデプロイはSSHを使ってデプロイ先サーバのコマンドを実行しているのです。
SSH接続でリモートポートフォワーディングを利用して、デプロイ先サーバの特定のポートをプライベートリポジトリへと転送することができそうです。

Capistranoは内部的にnet-sshライブラリを使用しており、このライブラリはポートフォワード・リモートポートフォワードにちゃんと対応してくれています。
今回はCapistrano本体に手を入れることなくconfig/deploy.rbのカスタマイズでプライベートリポジトリからデプロイできるようにしてみました。

 

Capistrano v3 RemotePortForwarding

 

バッチリデプロイできました!
今回の例はgitですが、理論的にはsvnでも上手く行くはずです。
ただし、httpの場合はHOSTヘッダなどの関係でうまくいかない場合があるのでご注意ください。

 

Comments are closed, but you can leave a trackback: Trackback URL.