Rista Tech Blog

株式会社リスタの技術?ブログ

Werckerでrails + elasticsearchのCI

CIにはwercker使っています。
werckerはDockerベースのCIサービスで、採用の理由は無料だからです。

werckerにはいろいろオシャレで便利な機能がある、
ようなのですが、すみませんぜんぜんわかりません。。。

最初はオシャレ機能を組み合わせていい感じに構築しようと思ったんですが、
ちょっとハマって面倒になって、けっきょく全部入りのDockerfileとwercker.ymlをベタ書きしました。。。

Dockerイメージ

githubDockerfileにおいてDocker Hubに登録しています。

Dockerfileはこんな感じです。

FROM ubuntu:16.04

# OSのTimezoneをTokyoに
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    echo 'Asia/Tokyo' > /etc/timezone && date

# rubyとbundlerをインストール
RUN cat /etc/apt/sources.list | sed -e 's|http://[^ ]*|mirror://mirrors.ubuntu.com/mirrors.txt|g' > /tmp/sources.list && mv /tmp/sources.list /etc/apt/sources.list
RUN apt-get update && \
    apt-get install -y software-properties-common git-core build-essential autoconf curl \
      ruby ruby-dev zlib1g-dev libmysqlclient-dev imagemagick libmagickcore-dev libmagickwand-dev && \
    gem install bundler --no-doc

# elasticsearch用のjavaをインストール
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886 && \
    echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" > /etc/apt/sources.list.d/webupd8team-java-trusty.list && \
    echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && \
    apt-get update && apt-get install -y oracle-java8-installer

# elasticsearchをインストール
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys D88E42B4 && \
    echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" > /etc/apt/sources.list.d/elasticsearch-2.x.list && \
    apt-get update && apt-get install -y elasticsearch=2.3.3

# rootパスワードを"root"に設定してmysql-serverをインストール
RUN echo "mysql-server mysql-server/root_password password root" | debconf-set-selections && \
    echo "mysql-server mysql-server/root_password_again password root" | debconf-set-selections && \
    apt-get -y install mysql-server mysql-client && \
    echo "character-set-server = utf8mb4" >> /etc/mysql/mysql.conf.d/mysqld.cnf && \
    echo "default-character-set = utf8mb4" >> /etc/mysql/conf.d/mysql.cnf

# feature spec用のphantomjsをインストール
ENV PHANTOMJS_VERSION 2.1.1
RUN apt-get install -y nodejs && \
    cd /tmp && \
    wget -q https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 && \
    tar jxf phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 && \
    mv phantomjs-$PHANTOMJS_VERSION-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs && \
    rm -rf phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 phantomjs-$PHANTOMJS_VERSION-linux-x86_64

OS、MWのバージョンなどは極力本番環境に合わせてます。

wercker設定

githubと連携設定をして、レポジトリ直下に以下のようなwercker.ymlを置いています。

box: mikeda/rails-test-with-elasticsearch

build:
  steps:
    - script:
      name: start services
      code: |
        service elasticsearch start
        service mysql start

    - script:
      name: bundle install --without production
      code: bundle install --path $WERCKER_CACHE_DIR/bundle-install/

    - script:
      name: setup db
      code: |
        /bin/cp config/database-wercker.yml config/database.yml
        RAILS_ENV=test bundle exec rake db:create
        RAILS_ENV=test bundle exec rake db:migrate
        RAILS_ENV=test bundle exec rake joblist:db:import_master_tables

    - script:
      name: rspec
      code: bundle exec rspec

  after-steps:
    - slack-notifier:
      url: $SLACK_URL
      channel: dev
      username: wercker
      notify_on: "failed"

テスト用のdb設定(config/database-wercker.yml)はこんな感じ。

test:
  database: joblist_test
  adapter: mysql2
  encoding: utf8mb4
  charset: utf8mb4
  collation: utf8mb4_general_ci
  pool: 5
  username: root
  password: root
  socket: /var/run/mysqld/mysqld.sock

after-stepsではテストに失敗したときにだけslackに通知を送っていています。
SlackのIncoming WebHooksのURLはベタ書きせずにWerckerのEnvironmentで変数化していますが、
まぁincomingだしベタ書きでもいい気はします。

まとめ

CIにはWercker使っています。
無料でこれだけの機能が使えるのは非常にありがたいです。

普段はDocker全く使ってませんが、こういう外部サービスでも手元で動作確認した本番環境と同じOS、MWが使えるのは環境構築やデバッグが楽でいいですね。