EngineYard 上のRailsアプリをWerckerでデプロイする

# はじめに

つい先日まで、EngineYard に Rails でアプリを構築して、自動テストは wercker でおこなっていたものの、デプロイは EngineYard のダッシュボード画面より手動でおこなっていました。

そろそろデプロイも自動化したいと思いましたが、wercker ではデフォルトでは EngineYardへのデプロイに対応していないません。どうも、Codeship というサービスが EngineYard へのデプロイに対応しているということで切り替えました。

しかしフリーでの利用はビルドが100回までという制限があり、実際運用してみると1週間ももたないということがわかり、Codeship の利用をあきらめました（コミットコメントに `[skip ci]` という文字列を含めると自動ビルドをスキップするという機能はあるのですが、100回という上限を気にしながら開発するのは精神衛生上よくないと考えました）

wercker ではデフォルトでは EngineYard へのデプロイには対応してないですが、自前のデプロイスクリプトなどを仕込むことができるなどの自由度があることがわかりました。

# 前提

- EngineYard に Github 上にソース管理している Rails アプリを稼働させている
- Wercker に Github 上のソースを指定している
(Github は public でも private でもよいと思います)

# Wercker の設定

## SSH Key の設定

すでに登録している app を選択すると [Settings] で設定ができます。そこの [SSH keys] で、SSH Key のペアを生成します。名前はなんでもいいです。下記のキャプチャでは wercker としています。

![wercker.png](https://qiita-image-store.s3.amazonaws.com/0/34168/1afcf7de-aad5-a154-3319-944ad1836b99.png)

この鍵は、EngineYard に SSH で接続するためのもので、当然、公開鍵は EngineYard のダッシュボード画面からサーバーに設定する必要があります（後述）

## Deploy targets の設定

次に、同じく、[Settings] で [Deploy targets] の設定を行います。残念ながら選択肢に EngineYard はないため、ここでは Custom deploy を選択します。

![wercker.png](https://qiita-image-store.s3.amazonaws.com/0/34168/72c72232-11a8-08cc-b57e-535b3cc10d69.png)

その後に設定できる Deploy target name は任意でかまいませんし、auto deploy にするかどうかのチェックボックスや、デプロイ対象とするブランチについては運用に合わせて設定してください。

大事なのは次の Deploy pipeline の設定です。

### Deploy pipeline の設定

Add new variable ボタンを押し、環境変数の追加をします。

Environment variable には text と SSH key pair の設定が可能です。

まずは text に EngineYard の api key を設定します。環境変数名は、`ENGINEYARD_API_KEY` としておいてください。

次に SSH key pair の設定をおこないます。ここでは上述の SSH Key の設定で設定した key を選択することができます。

![スクリーンショット_2014-12-06_20_22_08.png](https://qiita-image-store.s3.amazonaws.com/0/34168/6d18db68-2a2b-dcfb-50c3-9d36e8aa12c3.png)

そして次に環境変数名を設定します。わかりにくいですが、text のラジオボタンの上に記入します。ここでは `WERCKER_SSH_KEY` と設定しておいてください。自動的に公開鍵の環境変数名が`WERCKER_SSH_KEY_PUBLIC`に、秘密鍵の環境変数名が`WERCKER_SSH_KEY_PRIVATE`になります。

![wercker.png](https://qiita-image-store.s3.amazonaws.com/0/34168/25f65c4e-67fa-1a2b-dfb3-f894442f7157.png)

ここで決めた環境変数は後述する wercker.yml から参照することになります。

# EngineYard の設定

EngineYard のダッシュボード画面の Tools メニューから [SSH Public Keys] を選択します。

ここで先ほど wercker の設定画面で生成した公開鍵を登録します。名前は適当でいいです。デプロイする対象となる環境をチェックボックスで設定しておきます。

![Engine_Yard_Cloud_—_Keypairs.png](https://qiita-image-store.s3.amazonaws.com/0/34168/94f499c6-93a5-191a-905c-0999ca9c3b24.png)

サーバにこの公開鍵を配置する必要があるので、指定した環境は [Apply] しておいてください。

# wercker.yml の設定

werckerを使っているのならば、GithubにおいているRailsのソースのルートディレクトリにwercker.ymlを置いていると思いますが、その wercker.yml にデプロイの設定をおこないます。

```wercker.yml
deploy:
  steps:
    - script:
      name: make .ssh directory
      code: mkdir -p "$HOME/.ssh"
    - create-file:
      name: write ssh key
      filename: $HOME/.ssh/id_rsa
      overwrite: true
      hide-from-log: true
      content: $WERCKER_SSH_KEY_PRIVATE
    - script:
      name: set permissions for ssh key
      code: chmod 0400 $HOME/.ssh/id_rsa
    - script:
      name: add ssh-agent
      code: |
        eval `ssh-agent`
        ssh-add $HOME/.ssh/id_rsa
    - script:
      name: deploy to engineyard from wercker
      code: |
        gem install engineyard
        ey deploy --api-token=$ENGINEYARD_API_KEY -e <engineyardの環境> -c <engineyardのaccount> -r $WERCKER_GIT_COMMIT -m
```

中身としては、秘密鍵ファイルを動的に生成し、ssh-agent に登録しています。この時にSSHの設定でおこなった環境変数を使っています。
`ey` コマンドを使うため、engineyard gem をインストールし、ey のデプロイコマンドをたたくということをしています。今回は `-e` で環境名、`-c` でアカウント名を設定していますが、`-a` でアプリ名を指定することもできます。すべてを設定する必要はないですが、まずはローカルで実際に ey コマンドをたたき、うまくいくオプションの組み合わせを把握した上で設定するとよいと思います。

# さいごに

毎回、gem のインストールをするため多少の間はかかりますが（$WERCKER_CACHE_DIR を使ってもう少し速くできるのかもしれません）、無料枠内で制限なしでデプロイできるのはうれしい限りです。