継続的ブログ

主にweb系の技術について書いています

CircleCI2.0に移行しました(Rails)

早くなるという噂を聞いたので試しにやってみたら、少しだけ早くなりました。(8min→6min)

.circleci/config.yml

version: 2
jobs:
  build:
    docker:
      - image: ruby
        environment:
          - TZ: "/usr/share/zoneinfo/Asia/Tokyo"
          - LANG: ja_JP.UTF-8
          - LC_ALL: C.UTF-8
          - LANGUAGE: ja_JP.UTF-8
      - image: circleci/mysql
        environment:
          - MYSQL_ROOT_PASSWORD:

    # parallelism: 2
    working_directory: ~/repo
    steps:
      - checkout

      # Restore cache
      - type: cache-restore
        key: phantomjs-2.1.1
      - type: cache-restore
        key: repo-{{ checksum "Gemfile.lock" }}

      - run: apt-get update

      # Install phantomjs
      - run: apt-get install -y fonts-migmix
      - run: |
          which phantomjs && exit
          curl --location --silent https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar xj -C /tmp --strip-components=1
          mv /tmp/bin/phantomjs /usr/local/bin/phantomjs

      # Bundle install dependencies
      - run: bundle install -j 4 --path vendor/bundle

      # Store cache
      - type: cache-save
        key: phantomjs-2.1.1
        paths:
          - /usr/local/bin/phantomjs
      - type: cache-save
        key: repo-{{ checksum "Gemfile.lock" }}
        paths:
          - vendor/bundle

      # DB setup
      - run: bundle exec rake db:create
      - run: bundle exec ridgepole -E test -c config/database.yml --apply -f db/Schemafile --enable-migration-comments

      # Run rspec in parallel
      - type: shell
        command: |
          bundle exec rspec --profile 10 \
                            --format RspecJunitFormatter \
                            --out /tmp/test-results/rspec.xml \
                            --format progress \
                            $(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)

      - run: bundle exec rubocop -D -R -c .rubocop.yml

      - type: store_artifacts
        path: tmp/capybara/
        destination: capybara

      # Save artifacts
      - type: store_test_results
        path: /tmp/test-results

基本的には公式のものを参考に作りましたが、気をつけた点を少し紹介させていただきます。

Language Guide: Ruby - CircleCIcircleci.com

rubyはcircleci/rubyを使わず、docker公式のものを採用

https://hub.docker.com/r/circleci/ruby/

CircleCIが用意してくれているDockerイメージがあって、gitsshやDockerツールが最初からインストールされていてと便利なのですが、phantomjsインストールして使用する際に少し面倒だったので、公式のものを使うようにしました。

mysqlの方はcircleci/mysqlを使っています。

https://hub.docker.com/r/circleci/mysql/

phantomjsのインストール

個人 Rails アプリを CircleCI 2.0 で動くようにした - アジャイルSEの憂鬱sinsoku.hatenablog.com

こちらのブログを参考にさせていただきました。
ありがとうございました。

ArgumentError: invalid byte sequence in US-ASCIIが出る対策

ArgumentError: invalid byte sequence in US-ASCII on v2.2.0 in Docker · Issue #277 · ffaker/ffaker · GitHubgithub.com

上記URLを参考に下記設定をしています。

environment:
  - LANG: ja_JP.UTF-8
  - LC_ALL: C.UTF-8
  - LANGUAGE: ja_JP.UTF-8

featureスペックエラー時に保存しているスクリーンショットを見れるように

- type: store_artifacts
  path: tmp/capybara/
  destination: capybara

tmp/capybaraに保存したスクリーンショットをCircleCIのArtifactsから見れるようにしています。

f:id:akiza:20170702115849p:plain

まとめ

CIが少しでも早くなることは嬉しいですね。
まだβ版ですが使って見る価値はあるのではないでしょうか。