チラシ裏日記上等!!新館

Webアプリケーションエンジニアの雑記帳。映画とかアニメとかの記事も書きます。

RailsアプリケーションのCircleCI 2.1 の設定

GitHubコントリビュート状況

自分で作ったサービスのCIが未だにCircleCI 1系だったので重い腰を上げて2系にマイグレーションしました。

マイグレーションしたと言ってもカスタマイズらしいカスタマイズもしていなかったのでほとんど0から設定の作り直しです。とりあえず最低限テストを行える状態までこぎつけたので、備忘録がてら残しておこうと思います

操作する環境

環境は以下のような感じ

名前 バージョン
Ruby 2.5.1
Rails 5.2
MySQL 5.7

.circleci/config.yml

.circleci/config.ymlは以下

version: 2.1
executors:
  default:
    docker:
      - image: circleci/ruby:2.5.1
        environment:
          BUNDLE_JOBS: 3
          BUNDLE_RETRY: 3
          BUNDLE_PATH: vendor/bundle
          RAILS_ENV: test
          DB_USERNAME: root
          DB_HOST: 127.0.0.1
      - image: mysql:5.7
        environment:
          MYSQL_USER: root
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
    working_directory: ~/app
jobs:
  checkout_code:
    executor: default
    steps:
      - checkout
      - save_cache:
          key: app-code-{{ .Environment.CIRCLE_SHA1 }}
          paths: ~/app
  bundle_install:
    executor: default
    steps:
      - restore_cache:
          key: app-code-{{ .Environment.CIRCLE_SHA1 }}
      - restore_cache:
          key: app-gems-{{ checksum "Gemfile.lock" }}
      - run: bundle install
      - save_cache:
          key: app-gems-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle
  test_rspec:
    executor: default
    steps:
      - restore_cache:
          key: app-code-{{ .Environment.CIRCLE_SHA1 }}
      - restore_cache:
          key: app-gems-{{ checksum "Gemfile.lock" }}
      - run:
          name: Database setup
          command: |
            bundle exec rails db:create db:schema:load db:migrate
      - run: bundle exec rspec spec/
workflows:
  version: 2
  test:
    jobs:
      - checkout_code
      - bundle_install:
          requires:
            - checkout_code
      - test_rspec:
          requires:
            - bundle_install

せっかくなので2.1基準で作りました。

executors

executors は2.1で新しく入ったキーです。ジョブで共通で使用する実行環境に名前をつけることが出来ます。今回の例では default という名前の実行環境を定義しています。

executors:
  default:
    docker:
      - image: circleci/ruby:2.5.1
        environment:
          BUNDLE_JOBS: 3
          BUNDLE_RETRY: 3
          BUNDLE_PATH: vendor/bundle
          RAILS_ENV: test
          DB_USERNAME: root
          DB_HOST: 127.0.0.1
      - image: mysql:5.7
        environment:
          MYSQL_USER: root
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
    working_directory: ~/app

default という名前の後に docker キーで設定を書きます。ここの書き方は今まで jobs で設定していたように imageenvironment が書けます。

jobs

jobs はジョブを定義するキーです。 jobs のあとに続くマップで名前を定義し、中で実行環境と実行の手順を書いていきます。

jobs:
  checkout_code:
    executor: default
    steps:
      - checkout
      - save_cache:
          key: app-code-{{ .Environment.CIRCLE_SHA1 }}
          paths: ~/app
  bundle_install:
    executor: default
    steps:
      - restore_cache:
          key: app-code-{{ .Environment.CIRCLE_SHA1 }}
      - restore_cache:
          key: app-gems-{{ checksum "Gemfile.lock" }}
      - run: bundle install
      - save_cache:
          key: app-gems-{{ checksum "Gemfile.lock" }}
          paths:
            - vendor/bundle

executor では executors で定義した実行環境の名前を指定します。 steps では実行するタスクを run で書いていきます。

save_cachekey で指定した名前で path で指定したディレクトリをキャッシュします。 restore_cachesave_cached でキャッシュした内容をリストアします。依存するパッケージなどをキャッシュすることで、外部からのダウンロードの時間を省きCIを早くすることが出来ます。

workflows

workflows はジョブをまとめて実行順を制御しCIを行うための設定を書きます。

workflows:
  version: 2
  test:
    jobs:
      - checkout_code
      - bundle_install:
          requires:
            - checkout_code
      - test_rspec:
          requires:
            - bundle_install

ここでは test という名前のワークフローを定義し、中の jobs で定義したジョブを呼び出しています。各ジョブ間の依存も書くことが出来 requires で依存するジョブの名前を書きます。

参考書籍

CircleCIについての書籍はあまりないのですが、このあいだ出たWEB+DB PRESSの最新号がまさにCircleCI特集で、これを見て今回のCI環境を整えました。しばらくは唯一日本語でまとまったCircleCIの資料になると思います。

WEB+DB PRESS Vol.107

WEB+DB PRESS Vol.107

  • 作者: 大竹智也,浦井誠人,平野朋也,村田紘司,上野学,末永恭正,久保田祐史,吉川竜太,上野博司,牧大輔,西郡卓矢,桑原仁雄,小林謙太,竹馬光太郎,池田拓司,はまちや2,竹原,長谷川智希,北村壮大,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/10/24
  • メディア: 単行本
  • この商品を含むブログ (1件) を見る

まとめ

CircleCI設定を書いていきました。今後やりたいこととしてはCircleCI上でDockerのコンテナをビルドしECRにデプロイするところまでをやってみたいと考えています。