このブログは GitHub で管理しており、master に commit が追加される
と、CircleCI が capistrano を使ってデプロイします。

[2017-04-13-1] でテストを CircleCI 2.0 で動かしたので、デプロイも
試してみました。

最終的な circle.yml とデプロイスクリプトはこちらになりました。

基本的に “add_ssh_keys” と “deploy” step 以外は [2017-04-13-1]
同じです。ハマりそうなところだけ記載していきます。

ハマりそうなところ

Deployments - CircleCI のとおり、“deploy” step があればデプロイ出来ます。

ただ capistrano で GitHub の private repository をデプロイする場合、
最低 2 つは SSH Key が必要になると思います。

(1) 本番サーバ(masutaka.net)への SSH ログイン
(2) SSH ログイン後に GitHub に SSH アクセス

これらの設定方法を説明していきます。

デバッグは CircleCI の各ジョブの Rebuild with SSH から、実際に本番
サーバに ssh ログインできるか確認していくと、分かりやすいと思います。

(1) 本番サーバ(masutaka.net)への SSH ログイン

(1) の SSH Key をコンテナに注入するのが “add_ssh_keys” step です。

私は ssh-keygen で作った秘密鍵は以下のように登録し、対応する公開鍵
は本番サーバの ~/.ssh/authorized_keys に記載しています。

CircleCI SSH Permissions
例: https://circleci.com/gh/masutaka/masutaka.net/edit#ssh

circle.yml で “add_ssh_keys” step を追加する ことで、コンテナの
~/.ssh/config がこのように設定されます。

Host masutaka.net
  IdentitiesOnly yes
  IdentityFile /root/.ssh/id_rsa_437fb2...

masutaka ユーザとしてデプロイするために、さらに ~/.ssh/config に追
記しました。

最終的な ~/.ssh/config は以下になります。“ForwardAgent yes” は後述
します。

Host masutaka.net
  IdentitiesOnly yes
  IdentityFile /root/.ssh/id_rsa_437fb2...
  User masutaka
  ForwardAgent yes

Rebuild with SSH してコンテナに SSH ログインした後、
“$ ssh masutaka.net” 出来るようになりました。

(2) SSH ログイン後に GitHub に SSH アクセス

(2) の SSH Key はなにもしなくてもコンテナにあると思います。
Preferred にチェックが付いている SSH Key の秘密鍵が ~/.ssh/id_rsa
として存在していました。

CircleCI Checkout SSH keys
例: https://circleci.com/gh/masutaka/masutaka.net/edit#checkout

余談ですが、~/.ssh/authorized_keys の fingerprint はこのような関数
で確認すると良いと思います。

ssh-agent を起動させ、ssh-add する ことでメモリ上に ~/.ssh/id_rsa
がキャッシュされます。さらに前述の “ForwardAgent yes” の設定により、
本番サーバに SSH ログインした時に GitHub の Permission が存在する
状態になります。

“$ ssh masutaka.net” 後に、適当な GitHub の private repository を
git clone 出来るようになりました。これでデプロイも出来ると思います。

まとめ

capistrano で GitHub の private repository をデプロイするためには、
2 つの SSH Key が必要でした。設定方法は微妙に異なります。