ios circleciでcarthageのキャッシュが効かなかった原因と対応

はじめに

CircleCI 2.0 + Carthage で carthage bootstrap に時間がかかる場合の解決方法 - Qiita
こちらを参考にcarthageのキャッシュを使ってcircleciでのビルド時間を短縮。が、とあるタイミングでキャッシュが上手く効いていないようだった。

circleciでは以下のような出力

・・・
*** Valid cache found for SVProgressHUD, skipping build
*** Invalid cache found for SwiftDate, rebuilding with all downstream dependencies
*** Invalid cache found for SwiftWebSocket, rebuilding with all downstream dependencies
*** Invalid cache found for SwiftyJSON, rebuilding with all downstream dependencies
*** Invalid cache found for SwipeMenuViewController, rebuilding with all downstream dependencies
・・・

restore_cacheとsave_cacheはちゃんと動いていそうだが、carthage bootstrapで「Invalid cache found for ・・・」となってしまう

steps:
  - checkout
  - restore_cache:
      key: ca-{{ checksum "Cartfile.resolved" }}
  - run:
      name: Carthage
      command: carthage bootstrap --platform iOS --cache-builds
  - save_cache:
      key: ca-{{ checksum "Cartfile.resolved" }}
      paths:
        - Carthage

結論

原因はxcodeのバージョンを10.0.0から10.1.0に上げたことだった。Carthage/Build/.xxxxx.versionのhash がrestore_cache時の値とcarhage bootstrap値で違った。xcodeのバージョン上げたから当然なのか。。キャッシュのキーにxcodeのバージョンも追加して解決。

steps:
  - checkout
  - run:
      name: Set Xcode Version
      command: echo `xcodebuild -version` > XCODE_VERSION
  - restore_cache:
      key: ca-{{ checksum "XCODE_VERSION" }}-{{ checksum "Cartfile.resolved" }}
  - run:
      name: Carthage
      command: carthage bootstrap --platform iOS --cache-builds
  - save_cache:
      key: ca-{{ checksum "XCODE_VERSION" }}-{{ checksum "Cartfile.resolved" }}
      paths:
        - Carthage

以上です