まちいろエンジニアブログ

南池袋のWebサービス開発会社、株式会社まちいろのエンジニアブログです。

Ruby/Padrino/MySQL 5.7 プロジェクトをCircleCI 2.0 に移行してみた

こんにちは、まちいろの工藤です。

まちいろでは CI に CircleCI を利用していますが、先日ついに CircleCI の 2.0 が正式リリースされましたね。 まだ 2.0 に対応していなかったので、既存のプロジェクトを 2.0 に対応させてみました。

circleci.com

対象プロジェクトの技術スタック

対象プロジェクトは Ruby/Padrino で書かれた至って普通の Web アプリケーションって感じです。

移行手順

CircleCI 2.0 への移行は、2.0 用の設定ファイルを push するだけです。

2.0 から、設定ファイルが circle.yml から .circleci/config.yml に変更されています。 Circle CI のサイトから既存のリポジトリを選択すると config.yml の雛形が出てくるので、そちらを参考にすると良いかと思います。

以下、最終的にできあがった config.yml です。

version: 2

jobs:
  build:
    working_directory: ~/repo
    docker:
      - image: circleci/ruby:2.4.1-node-browsers
        environment:
          DB_HOST: 127.0.0.1
      - image: mysql:5.7
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --innodb-large-prefix=true --innodb-file-format=Barracuda
        environment:
          MYSQL_USER: foo
          MYSQL_PASSWORD: foo
          MYSQL_DATABASE: foo
          MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
          MYSQL_ROOT_HOST: '%'
    steps:
      - checkout

      - run:
          name: install dockerize
          command: wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && tar -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
          environment:
            DOCKERIZE_VERSION: v0.5.0

      - run:
          name: Wait for db
          command: ./dockerize -wait tcp://localhost:3306 -timeout 1m

      # Download and cache dependencies
      - restore_cache:
          keys:
          - foo-vendor-bundle-{{ checksum "Gemfile.lock" }}
          # fallback to using the latest cache if no exact match is found
          - foo-vendor-bundle-

      - run:
          name: bundle install
          command: bundle install --jobs=4 --path vendor/bundle

      - save_cache:
          key: foo-vendor-bundle-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle

      # Database setup
      - run:
          name: init db
          command: RACK_ENV=test DB_YAML=tools/circleci/database.yml bundle exec rake db:initdb

      # run tests!
      - run:
          name: rspec
          command: RACK_ENV=test DB_YAML=tools/circleci/database.yml bundle exec rake spec

移行時のポイント

  • MySQL コンテナの環境変数 MYSQL_ROOT_HOST を指定して、テストを実行するコンテナから疎通可能とする
  • dockerize を利用して、MySQL が起動した後にテストが実行されるようにする
  • restore_cache/save_cache を利用して、bundle install の結果をキャッシュして高速化
  • Padrino の場合、DB 設定を config/database.rb に記述するため、DB_YAML に database.yml のパスを渡したらそちらの設定を適用するようコードを修正

移行した結果

CircleCI 2.0 に移行したら、テストの実行時間が半分以下まで減りました :)