CircleCIでCarthageのビルド済みバイナリをキャッシュする
Carthage
のビルド済みバイナリを今までプロジェクトのソース管理に含めてきましたが、Xcode
を移行しづらかったり、プロジェクトのレポジトリが肥大化してクローンにかなり時間がかかったりなど、そろそろ限界を感じてきたので、ついに.gitignore
に追加して Carthage
のビルド済みバイナリとお別れしました😇👋
# Carthage # # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts Carthage/Checkouts Carthage/Build
そんなこんなで、CI
側でプロジェクトをビルドする際にCarthage
ライブラリのbootstrap
が必要になりました。ただ、ワークフロー毎に毎回 Carthage
ライブラリをフェッチしてビルドし直してたんじゃ、時間がかかりすぎるので、タイトルの通り「キャッシュを利用してプロジェクトをビルドできるようにしようぜ!」という心意気が大事になります。
それではやっていく
やることは至ってシンプルで、Carthage
のビルド済みバイナリを取得するjob
を追加して、ワークフロー内のビルドを伴うjob
の前で実行するようにすれば完了です。
下記が Carthage
のキャッシュを取得&保存するためのjob
になります。
jobs: // 省略.. carthage_dependencies: executor: parnovi-macos steps: - restore_caches - run: name: Carthage build command: make install-carthage - save_cache: key: carthage-v1-{{ checksum "Cartfile.resolved" }} paths: - ~/parnovi-ios/Carthage
restore_caches
は commands
によってカスタムで設定できるステップで、設定は下記のようになっています。restore_caches
の役割は、プロジェクトのソースファイル・Bundler
ライブラリ・Carthage
ライブラリのキャッシュを取得することで、キャッシュが無い場合や依存関係に変更がある場合は何も行われません。
ちなみにcommands:
でステップを定義するには、バージョン2.1
が必須になります。
commands: save_sha: steps: - run: name: Save commit SHA1 to .sha command: echo $CIRCLE_SHA1 > .sha restore_caches: steps: - save_sha - restore_cache: keys: - parnovi-v1-{{ checksum ".sha" }} - restore_cache: keys: - bundle-v1-{{ checksum "Gemfile.lock" }} - restore_cache: keys: - carthage-v1-{{ checksum "Cartfile.resolved" }}
make install-carthage
はMakefile
で定義したCarthage
のbootstrap
を行うコマンドで実態は下記のようになります。carthage.sh
になっている理由はこちらをご覧ください。また、Carthage
のビルドオプションに--cache-builds
を付けないと、ライブラリがリビルドされてしまい、コンテナでキャッシュしている意味がなくなってしまうので気をつけてください👷♀️
$ ./carthage.sh bootstrap --platform iOS --cache-builds --no-use-binaries
save_cache
の役割は特定のファイルをキャッシュすることで、今回の場合はcarthage-v1-{{ checksum "Cartfile.resolved" }}
のキーにプロジェクトルートのCarthage
ディレクトリがキャッシュされます。このcarthage-v1-{{ checksum "Cartfile.resolved" }}
キーはchecksum
によってCartfile.resolved
の内容をみて値が動的に代わります。つまり、Cartfile.resolved
の内容が変更されると新しいキーでキャッシュが作成されます。
ちなみにここで作成されたキャッシュは、最長で15日間保存されます。手動でキャッシュをクリアしたい場合は、キーの名前を変更する必要があります。今回はxxx-v1-xxx
のようなフォーマットにしているのでv1
をv2
などにすればキャッシュがクリアされます。
てな感じ本日も以上になります🍺