Ruby/Padrino/MySQL 5.7 プロジェクトをCircleCI 2.0 に移行してみた
こんにちは、まちいろの工藤です。
まちいろでは CI に CircleCI を利用していますが、先日ついに CircleCI の 2.0 が正式リリースされましたね。 まだ 2.0 に対応していなかったので、既存のプロジェクトを 2.0 に対応させてみました。
対象プロジェクトの技術スタック
対象プロジェクトは 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 に移行したら、テストの実行時間が半分以下まで減りました :)