はじめに
つい先日まで、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 としています。
この鍵は、EngineYard に SSH で接続するためのもので、当然、公開鍵は EngineYard のダッシュボード画面からサーバーに設定する必要があります(後述)
Deploy targets の設定
次に、同じく、[Settings] で [Deploy targets] の設定を行います。残念ながら選択肢に EngineYard はないため、ここでは Custom deploy を選択します。
その後に設定できる 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 を選択することができます。
そして次に環境変数名を設定します。わかりにくいですが、text のラジオボタンの上に記入します。ここでは WERCKER_SSH_KEY
と設定しておいてください。自動的に公開鍵の環境変数名がWERCKER_SSH_KEY_PUBLIC
に、秘密鍵の環境変数名がWERCKER_SSH_KEY_PRIVATE
になります。
ここで決めた環境変数は後述する wercker.yml から参照することになります。
EngineYard の設定
EngineYard のダッシュボード画面の Tools メニューから [SSH Public Keys] を選択します。
ここで先ほど wercker の設定画面で生成した公開鍵を登録します。名前は適当でいいです。デプロイする対象となる環境をチェックボックスで設定しておきます。
サーバにこの公開鍵を配置する必要があるので、指定した環境は [Apply] しておいてください。
wercker.yml の設定
werckerを使っているのならば、GithubにおいているRailsのソースのルートディレクトリに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 を使ってもう少し速くできるのかもしれません)、無料枠内で制限なしでデプロイできるのはうれしい限りです。