xxxcaqui.log

ツッコミお待ちしています

GithubにあるプライベートリポジトリをCapistranoでデプロイ

やりたいことはタイトルの通りです。

ここでは、RailsアプリをEC2にデプロイするつもりで書いていきます。
サーバ側の環境構築(SSHやユーザ関連の設定、DBのインストールなど)は終わっている前提で。

Capistranoの理解に関しては割と自信がないので、ツッコミお待ちしています。

結論

初めに、出来上がるdeploy.rbを載せてしまいます。

#config/deploy.rb
require "bundler/capistrano"
load "deploy/assets"

# Git repository
set :scm,         "git"
set :repository,  "git@github.com:foo/bar.git"
set :branch,      "master"

ssh_options[:forward_agent] = true
default_run_options[:pty]   = true

# Server setting
ec2 = "ec2-x-x-x-x.ap-northeast-1.compute.amazonaws.com"
role :web, ec2
role :app, ec2
role :db,  ec2, :primary => true

set :application, "app_name"
set :user, "server_user_name"
set :use_sudo, false
set :deploy_to, "/home/#{user}/#{application}"
set :rails_env, "production"
default_run_options[:shell] = '/bin/bash --login'

deploy.rbで何をやっているのか

上のdeploy.rbの記述内容のうち、ほとんどはCapistranoではおなじみのものだと思います。

今回のプライベートリポジトリ関連のキモを簡単に説明していきます。

set :repository, "git@github.com:foo/bar.git"

デプロイするコードが置かれているGithubのリポジトリを指定します。

この引数をGitプロトコルではなくHTTPSで指定するとソースの取得に失敗するので注意してください。

ssh_options[:forward_agent] = true

ssh_options[:forward_agent]をtrueに設定すると、デプロイ先サーバがGithubからgit cloneする際にCapistranoコマンドを実行したユーザの秘密鍵が使われます。

つまり、「cap deployを実行するユーザの公開鍵がデプロイ先サーバとGithubの両方に登録されている必要がある」代わりに「デプロイ先サーバにGithub接続用の鍵ペアを新規作成→公開鍵をGithubに登録」という作業が不要になります。

また、同じこと以下のようにも書けます。

set :ssh_options, { forward_agent: true }

default_run_options[:pty] = true

Capistranoでは、Github上のコードをデプロイ先のホストへ持ってくるため、git cloneします。
このときの git clone がデプロイ先ホストからGithubへの初めての接続である場合、以下のようなエラーメッセージが出てデプロイに失敗します。

[host :: err] Host key verification failed.
[host :: err] fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

このエラーメッセージが表示されているとき、GithubへのSSH接続に際して「Are you sure you want to continue connecting (yes/no)?」みたいな確認*1が行われています。

そこで、default_run_options[:pty] = true を指定しておくことによって、この質問にyesと答えて先へ進むことができます*2

さいごに

プライベートリポジトリにあるコードをデプロイする方法をググってみたところ、情報が少なかったので「俺がまとめてやるぜー!」と意気込んでまとめてみましたが、いざ書いてみると全然大したことしてない感じになってしまいました。

書き終わってから「もしかして、まとめるまでもないくらい簡単に設定できるからエントリが書かれてないだけなのでは?」と思いましたが、せっかく書いたので公開しておきます。

間違ってたらごめんね☆

*1:よく見るやつです。

*2:たぶん。結果的にうまく動いたものの、なぜうまく動いたのかわからない。それらしいドキュメントもソースも見当たらなくてぐぬぬ。教えてエロい人。