CircleCI の bundle install 時のキャッシュを調整する

CircleCI のキャッシュって便利ではあるんですが、面倒ですよね

ぼくが手伝い始めた直後、謎のエラーで CircleCI が失敗する事が何度もありました

キャッシュベースの問題

ひとつめは、キャッシュベースの問題。新しいブランチで bundle install が実行される時に元になるキャッシュが指定できるのですが、これが間違っていて、本来使うべきは develop ブランチなどの安定版(確実に対象のブランチよりも古いコミットでのビルド)のキャッシュですが、そうではなくすべてのビルドで最後に成功したものになっていました

そのため、 Gemfile の更新を誰かが行なっている最中に新しい PR で CI を回すと確実に失敗するようになっていました。ドキュメントを参考にキャッシュ設定を見直すことで、これが原因での失敗は起こらなくなりました

- restore_cache:
  keys:
    - v30-gem-cache-{{ arch }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
    - v30-gem-cache-{{ arch }}-{{ .Branch }}
    - v30-gem-cache ← これが悪さをしていた
- restore_cache:
  keys:
    - v30-gem-cache-{{ arch }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
    - v30-gem-cache-{{ arch }}-{{ .Branch }}
    - v30-gem-cache-{{ arch }}-develop

参考: https://circleci.com/docs/ja/2.0/caching/

npm モジュールのコンフリクト

Ruby and Rails のアプリケーションでフロントエンドの人たちが厳しい気持ちになる一つとして、 gem 経由でインストールされる npm パッケージの存在があります

Gem のバージョンをあげたタイミングで jest-haste-map が混乱して正しく import できないというエラーが発生していました

The name `i18n-js` was looked up in the Haste module map. It cannot be resolved, because there exists several different files, or packages, that provide a module for that particular name and platform. The platform is generic (no extension). You must delete or exclude files until there remains only one of these:

      * `/home/circleci/www/vendor/bundle/ruby/2.6.0/gems/i18n-js-3.0.5/package.json` (package)
      * `/home/circleci/www/vendor/bundle/ruby/2.6.0/gems/i18n-js-3.8.0/package.json` (package)

対策としては CircleCI での bundle install 時に (キャッシュクリアオプション)を追加する事で解決したわけですが、数文字の修正ですべてのワークフローが止まってしまう問題を解決できたのはコスパが良かったな、、、と思います

-      - run: bundle install --path vendor/bundle
+      - run: bundle install --path vendor/bundle --clean

この記事は iCARE の技術顧問がどんな事をやっているか - 2021アドベントカレンダー の8日目の記事です

この記事が気に入ったらサポートをしてみませんか?