iOSエンジニアのつぶやき

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

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 ライブラリをフェッチしてビルドし直してたんじゃ、時間がかかりすぎるので、タイトルの通り「キャッシュを利用してプロジェクトをビルドできるようにしようぜ!」という心意気が大事になります。

f:id:yum_fishing:20210319171027p:plain

それではやっていく

やることは至ってシンプルで、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_cachescommandsによってカスタムで設定できるステップで、設定は下記のようになっています。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-carthageMakefileで定義したCarthagebootstrapを行うコマンドで実態は下記のようになります。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のようなフォーマットにしているのでv1v2などにすればキャッシュがクリアされます。

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

参考

circleci.com

circleci.com

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com