~/.yarn-cache/ を CI でキャッシュしてはいけない

  • 30
    いいね
  • 3
    コメント

2017/01/16 (月) 追記:

CircleCI の公式ドキュメントに yarn の導入方法が明記されています。今後はそちらに合わせるのがベターです。

これまで行っていた設定だと、yarn のパッケージインストールのタイミングで「すでに yarn がインストール済み」とエラーが発生するようになってしまいました。よって以下は古い記事なので、読み飛ばしてください。


要約すると

  • yarn 0.17.x から、キャッシュ保存先が OS によって変わる ようになった!
  • CI で ~/.yarn-cache/ をキャッシュする設定を入れている場合、正しいパスに変える必要がある
    • :arrow_right: ~/.cache/yarn/ (Linux の場合)

事の流れ

先週あたりから、npm に代わって yarn を使い始めました。
実際にビルドやデプロイが早くなったり、CI が早くなったりと、いろんな好影響があって yarn バンザイな感じです。

CircleCI の設定

ちょうど CircleCI を使用していたので、先人の知恵をありがたくお借りして実装を進めました。

yarn 0.16.x までの設定

machine:
  node:
    version: 4.6.0

  post:
    - curl -o- -L https://yarnpkg.com/install.sh | bash

dependencies:
  cache_directories:
    - "~/.yarn-cache"

  pre:
    - yarn --version

  override:
    - yarn install

test:
  override:
    - echo test

キャッシュディレクトリとして ~/.yarn-cache を指定しておくのがミソ。

CircleCIでyarnを使う - tehepero note(・ω<)

CircleCI 上で確認

ディレクトリのキャッシュ設定が上手くできていない場合は yarn install[2/4] Fetching packages... が走ってしまいますが、キャッシュできている場合はその前で止まります。

:o: キャッシュできてる :x: キャッシュできてない
スクリーンショット 2016-11-21 19.10.35.png スクリーンショット 2016-11-21 19.10.13.png

yarn.lock に変更が無いことが前提です。

yarn 0.17.x におけるキャッシュフォルダの変更

この設定で、先日まで上手く動いていたのですが、今日 CI を確認したところ、CI のキャッシュが効いてない(右図の)状態になっていました。

調べたところ、先日 stable になったバージョン (0.17.6) で、macOS / Linux の yarn キャッシュフォルダが変更になった ようです。

OS 新しいキャッシュ先
macOS ~/Library/Caches/Yarn/
Linux ~/.cache/yarn/

ちなみに、フォルダの変更自体は 0.17.0 の時点ですでに適用されていたみたいです。

~/.yarn-cache/ の設定を見直そう

ということで、~/.yarn-cache/ を CI でキャッシュする設定を書いている場合は、CI のコンテナ OS に合わせてパスを見直す 必要があります。

  dependencies:
    cache_directories:
-     - "~/.yarn-cache"
+     - "~/.cache/yarn"

キャッシュフォルダの場所を調べる

以下のコマンドで、現在の環境のキャッシュフォルダの場所がわかります。

$ yarn cache dir

出力はこんな感じ。:arrow_down:

yarn cache v0.17.6
/Users/yhatt/Library/Caches/Yarn
✨ Done in 0.05s.

cd $(yarn cache dir --silent) みたいに動的に使う事もできるかな?と思ったんですが、残念ながら --silent オプション未対応。

無理やり yarn cache dir | sed -n 2p とする事もできますが、出力フォーマットが変わったりすると対応できなくなる可能性があるのでオススメしません。