12FF5B8

hico_horiuchiの技術系な覚え書き.

RailsでTravis CI使うメモ

GitHub側の準備

個人のリポジトリだとTravis CIにログインした時点で読み込まれるけど,チーム(Organization)だと自分で設定する必要があるみたい.

GitHubリポジトリの Settings → Webhooks & Services → Services
TravisのUserとTokenを入力して追加する.
(TokenはTravisの Accounts → Profile で見られる.)

あと,Travisの Accounts → Repositories で対象のリポジトリをONにする.

.travis.yml

Travisリポジトリ直下の.travis.ymlに書いた設定に従ってテストする.
今回はRails用に以下のように書いてみた.

language: ruby
rvm:
  - 2.1.2
bundler_args: --without development
env:
  - DB=postgresql
before_script:
  - cp config/database.yml.travis config/database.yml
script:
  - bundle exec rake db:drop db:create db:migrate db:seed
  - bundle exec rake spec
notifications:
  email: false

自分でTravisの設定書くのは初めてなので,無駄とか不足があるかも.
config/database.yml.travisでは,usernamepasswordは空にしておく.

いざpush!!

これで,あとはリポジトリにpushすればテストが走るはず.
bundle installに結構時間がかかるので,テストに5分くらいかかる.
今回は結果のメール通知を切ってるけど,他にもIRCで流したりできるみたい.

プルリクのページにも結果が表示されたり,READMEにバッヂ付けたりできるの格好良い.

AnsibleでRailsをデプロイ

インターンシップで構成管理ツールansibleを使う機会があり,それから愛用するようになった.
ansibleではyaml形式でplaybookと呼ばれるレシピを書き,それをssh経由で実行する.
(操作を抽象化するモジュールが標準で多く準備されている.ドキュメント参照.)
chefのようにクライアント側の用意が必要なく,シンプルなのが良い.

今回は,学生プロジェクトで開発中のrailsアプリをデプロイするplaybookを作成してみた.
f:id:hico_horiuchi:20141007175919p:plain

前提条件

デプロイ先となる本番サーバには,nginxとDB(postgreなど)はインストール済とする.

作成したplaybook

hostsにデプロイするrailsのgitリポジトリとプロジェクト名,本番DBのパスワードを書く.
ansible-playbook -i hosts deploy.ymlを実行すると,以下の順で処理が走る.

  1. git.ymlリポジトリをホーム直下にclone
  2. bundle.ymlbundle install
  3. nginx.ymlunicornリバースプロキシ用のnginx設定ファイルをコピー・パスを設定
  4. unicorn.ymlunicorn実行用shellscriptをコピー・パスを設定
  5. database.ymlrailsのDBを設定(パスワード設定,db:setupまたはdb:migration)
  6. assets.ymlassets:precompile
  7. service.ymlunicornとnginxを再起動

デプロイ用Rakeタスク

rake deploy:ansibleで実行できるようにRakeタスクも作成した.

  • lib/tasks/deploy.rake
namespace :deploy do
  desc 'Deploy using Ansible'

  task :ansible do
    hosts = "#{Rails.root}/playbook/hosts"
    playbook = "#{Rails.root}/playbook/deploy.yml"
    system "ansible-playbook -i #{hosts} #{playbook}"
  end
end

まとめ

ちまちま開発して頻繁にデプロイするので,自動化で便利になった.
あと,ヒューマンエラーが無くなるのも良いかな.
これからもansibleを使ってガンガン自動化を推し進めていきたい.