先日CircleCI
でCocoaPods
によるライブラリの依存関係をキャッシュしようと下記のようなJob
をconfig.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
でキャッシュを取得しています。
これでpod install
したライブラリをキャッシュできるだろうと思っていたら、キャッシュがされずにBuild Error
が発生。調べてみると同様の問題が報告されていて、どうやらresoter_cache
とsave_cache
で、cocoapods-v1-{{ checksum "Podfile.lock" }}
による生成されるキーが異なっているためでした。
キャッシュのフォールバック処理を追加して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_cache
とsave_cache
で差異があるということは、Podfile.lock
がmake install-cocoapods(bundle install --jobs=4)
時に変更されていることを意味します。そう思いながらもとりあえず上記の解決法でCircleCI
を変更してみると、プロジェクトのコンパイル自体は通るもののCocoaPods
のRunScript
フェーズで下記のようなエラーが発生しました。
The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
どうやらPodfile.lock
とsandbox
との内容が一致していないことが問題みたいです。じゃあpod install
でPodfile.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 setup
でSpec
レポを設定し直しました。そして再度。
$ 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
レポの新しい名前らしいです。
ということで、diffをコミットして再度CI
を回すと無事ビルドが成功するようになりました🚀
てな感じで本日も以上になります🍺
参考
- https://discuss.circleci.com/t/how-to-cache-cocoapods/28857
- https://stackoverflow.com/questions/54338406/circleci-for-ios-caching-cocoapods-dependencies
- https://zenn.dev/wasavi/articles/bf4c546f3566d3238759
- https://qiita.com/g08m11/items/1a0ff1580cca870ed209