iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【CircleCI】CocoaPodsのキャッシュがうまくできない

先日CircleCICocoaPodsによるライブラリの依存関係をキャッシュしようと下記のようなJobconfig.ymlに追加しました。

jobs:
// 省略
  cocoapods_dependencies:
    executor: hoge-macos
    steps:
      - restore_caches
      - run:
          name: CocoaPods install
          command: make install-cocoapods
      - save_cache:
          key: cocoapods-v1-{{ checksum "Podfile.lock" }}
          paths:
            - ~/hoge-ios/Pods

restore_cachesカスタムコマンドについては、以前の記事でも書いた通りKeyを元にrestore_cacheでキャッシュを取得しています。

yamato8010.hatenablog.com

これでpod installしたライブラリをキャッシュできるだろうと思っていたら、キャッシュがされずにBuild Errorが発生。調べてみると同様の問題が報告されていて、どうやらresoter_cachesave_cacheで、cocoapods-v1-{{ checksum "Podfile.lock" }}による生成されるキーが異なっているためでした。

discuss.circleci.com

キャッシュのフォールバック処理を追加してPodsの最新のキャッシュをとってくるようにする、下記のような解決策もありましたが、そもそもcocoapods-v1-{{ checksum "Podfile.lock" }}の値が変動していることは問題です🤔

commands:
  restore_caches:
    steps:
      // 省略
      - restore_cache:
          keys:
            - cocoapods-v1-{{ checksum "Podfile.lock" }}
            - cocoapods-v1-

cocoapods-v1-{{ checksum "Podfile.lock" }}の値がrestore_cachesave_cacheで差異があるということは、Podfile.lockmake install-cocoapods(bundle install --jobs=4)時に変更されていることを意味します。そう思いながらもとりあえず上記の解決法でCircleCIを変更してみると、プロジェクトのコンパイル自体は通るもののCocoaPodsRunScriptフェーズで下記のようなエラーが発生しました。

The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

どうやらPodfile.locksandboxとの内容が一致していないことが問題みたいです。じゃあpod installPodfile.lockが直るのか?と思いpod installを実行すると、Podfile.lockにdiffが出る代わりに下記のような警告が表示されました。

[!] Your project does not explicitly specify the CocoaPods master specs repo. Since CDN is now used as the default, you may safely remove it from your repos directory via `pod repo remove master`. To suppress this warning please add `warn_for_unused_master_specs_repo => false` to your Podfile.

ローカルのSpecレポに何やら問題がありそうですね。ということで、警告の通りpod repo remove masterした後にpod setupSpecレポを設定し直しました。そして再度。

$ pod install

次はPodfile.lockにdiffが出ていました。

$ git diff
diff --git a/Podfile.lock b/Podfile.lock
index 4ea39d7b..b44124d7 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -110,7 +110,7 @@ DEPENDENCIES:
   - SwiftLint
 
 SPEC REPOS:
-  https://github.com/CocoaPods/Specs.git:
+  trunk:
     - Firebase
     - FirebaseAnalytics
     - FirebaseAnalyticsInterop

diffが出ていることからも分かる通り、どうやらローカルのSpecレポが更新されていないためPodfile.lockも同様に更新されていなかったのが全ての元凶でしょう。つまり、CircleCI上ではCocoaPodsの最新のSpecレポを使ってpod installが実行されることによりPodfile.lockが更新されて、cocoapods-v1-{{ checksum "Podfile.lock" }}の値が更新前と更新後で異なってしまったことが原因だと考えられます。ちなみにここで出ているtrunkはメインSpecレポの新しい名前らしいです。

github.com

ということで、diffをコミットして再度CIを回すと無事ビルドが成功するようになりました🚀

てな感じで本日も以上になります🍺

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com