前回(MiddlemanでbuildしたコンテンツをCircleCI経由でAmazon S3に同期する)の設定を発展させて、capistranoを加えてリモートホストへデプロイしたいと思います。
とにかく簡単にCircleCIとcapistranoを連携させたかったので、前回同様、必要なモノは少ないです。
今回に関してはMiddlemanでなくても単なる静的コンテンツでもデプロイ可能です。ホストをSSHが使えるレンタルサーバー等にすれば、サーバーの設定も必要なく使えると思います。
手順
結果:masterをGitHubにプッシュするとCircleCIのビルドが走り、変更がさくらVPSのサーバーにデプロイされる
ホスト側の設定
ホストはApacheだけ設置して放置していたさくらのVPSの512を使いました。ApacheやSSHの設定について、詳しいことはウェブ上にある多くの情報に譲ります。(私の知識はMAMPで多少いじったことがある程度です)
gitが必要ですが、確か最初からインストールされていたような気がします。
Webサーバーの設定
とりあえず確認できればよしということで、/var/www/
以下にデプロイ用のディレクトリを作って、デプロイするユーザーに権限を与えました。ここでgit checkout/pull
させ、buildディレクトリをapacheのDocumentRoot
にすることで公開します。
デプロイ先:/var/www/hoge/
↓ デプロイ先でcapistranoがGitHubのfugaリポジトリをcheckout/pull
する
checkout先:/var/www/hoge/fuga/
↓ MiddlemanのbuildディレクトリをDocumentRoot
に設定
公開ディレクトリ:/var/www/hoge/fuga/build/
SSHの設定
ローカルでssh-keygen
して認証鍵を作成します。あとで秘密鍵をCircleCIに登録する必要があるので、このプロジェクト用の鍵を新たに生成しました。
公開鍵(.pub
)の方をホストのデプロイ用ユーザーの~/.ssh
に置いてauthorized_keys
に登録。
capistranoの設定
S3と同期する設定を削除し、capistranoを追加します。
- gem 'middleman-s3_sync'
+ gem 'capistrano'
- activate :s3_sync do |s3_sync|
- s3_sync.bucket = 'elasticbeanstalk-ap-northeast-1-149281802293'
- s3_sync.region = 'ap-northeast-1'
- end
capistranoの設定ファイルを作成します。
bundle exec cap install
以下のような構成が作成されます。
├── Capfile # 変更なし
├── config
│ ├── deploy
│ │ ├── production.rb # productionのデプロイ設定
│ │ └── staging.rb # stagingのデプロイ設定(今回は使用しない)
│ └── deploy.rb # 共通のデプロイ設定
└── lib
└── capistrano
└── tasks
共通のデプロイ設定は単にgit checkout/pull
しているだけです。
set :application, '<your-app>'
set :repo_url, '<your-repository>'
set :deploy_to, '<your-public-path>'
set :pty, true
task :deploy do
on roles(:web) do
application = fetch :application
deploy_to = fetch :deploy_to
if test "[ -d #{deploy_to}/#{application} ]"
execute "cd #{deploy_to}/#{application}; git pull"
else
execute "cd #{deploy_to}; git clone #{fetch :repo_url} #{application}; cd #{application}"
end
end
end
production用の設定はホストのログイン設定のみ。
role :web, %w{<user-name>@<host>}
ここまでの設定で、ローカルからデプロイすることができます。
bundle exec cap production deploy:check
bundle exec cap production deploy
参考:Capistrano3でGithubにあるコードをデプロイ
CircleCIの設定
CircleCIからさくらVPSのホストにSSHでログインさせるため、先ほどのSSHの設定で、ローカルで作成した認証鍵の秘密鍵(.pub
じゃない方の内容)をCircleCIの Project Settings » SSH Permissions に登録する。
Circle.yml
はRubyバージョンを追加して、デプロイコマンドをcapistranoに変更。
machine:
timezone: Asia/Tokyo
ruby:
version: 2.0.0-p481
dependencies:
pre:
- gem install bundler --pre
deployment:
deploy:
branch: master
commands:
- bundle exec cap production deploy:
timeout: 1200
これで、masterにpushするとCircleCIがbuildを開始し、自動的にホストに変更をデプロイすることができました。