MiddlemanでbuildしたコンテンツをCircleCI/capistranoでさくらのVPSにデプロイする

前回（[MiddlemanでbuildしたコンテンツをCircleCI経由でAmazon S3に同期する](http://qiita.com/110chang/items/747ccd255617d38b7353)）の設定を発展させて、[capistrano](https://github.com/capistrano/capistrano)を加えてリモートホストへデプロイしたいと思います。

とにかく簡単に[CircleCI](https://circleci.com/)とcapistranoを連携させたかったので、前回同様、必要なモノは少ないです。

今回に関してはMiddlemanでなくても単なる静的コンテンツでもデプロイ可能です。ホストをSSHが使えるレンタルサーバー等にすれば、サーバーの設定も必要なく使えると思います。

# 手順

1. [Middleman](https://middlemanapp.com/jp/)のプロジェクトを作成（[前回](http://qiita.com/110chang/items/747ccd255617d38b7353)参照）
2. さくらVPS側の設定を行う（Webサーバーの設定/SSHの設定）
3. capistranoの設定を行う
3. CircleCIの設定を行う

結果：masterをGitHubにプッシュするとCircleCIのビルドが走り、変更がさくらVPSのサーバーにデプロイされる

# ホスト側の設定

ホストはApacheだけ設置して放置していた[さくらのVPS](http://vps.sakura.ad.jp/)の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`に登録。

参考：[さくらのVPSを借りて、真っ先に設定した内容まとめ](http://tadasy.hateblo.jp/entry/20130306/1362584939)

# capistranoの設定

S3と同期する設定を削除し、capistranoを追加します。

```diff:Gemfile
- gem 'middleman-s3_sync'
+ gem 'capistrano'
```

```diff:config.rb
- 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`しているだけです。

```ruby:deploy.rb
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用の設定はホストのログイン設定のみ。

```ruby:production.rb
role :web, %w{<user-name>@<host>}
```

ここまでの設定で、ローカルからデプロイすることができます。

```bash
bundle exec cap production deploy:check
bundle exec cap production deploy
```

参考：[Capistrano3でGithubにあるコードをデプロイ](http://qiita.com/s-kiriki/items/08d500893c0764510e43)

# CircleCIの設定

CircleCIからさくらVPSのホストにSSHでログインさせるため、先ほどのSSHの設定で、ローカルで作成した認証鍵の秘密鍵（`.pub`じゃない方の内容）をCircleCIの Project Settings &raquo; SSH Permissions に登録する。

`Circle.yml`はRubyバージョンを追加して、デプロイコマンドをcapistranoに変更。

```yaml:circle.yml
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を開始し、自動的にホストに変更をデプロイすることができました。