MintでインストールしたパッケージをBitriseにキャッシュさせる方法

iOSのプロジェクトにSwiftLintを導入していて、SwiftLint自体はMintでインストールしています。

Bitrise上でSwiftLintを実行するためにはビルド前にSwiftLintをインストールしておく必要があるため、Xcode Test for iOSステップの前にScriptステップを配置し、Scriptステップにてmint bootstrapを実行するようにしています。


mint bootstrapコマンドを実行すると、SwiftLintのリポジトリをクローンして、ビルドを行います。
私の環境ではこの処理に5、6分かかっていました。

テストを行うたびにこの処理を行うのは時間の無駄なので、Mintでインストールしたパッケージはキャッシュしておいて、次回ビルドを行うときはキャッシュに保存されているSwiftLintのバイナリを使用できると効率的です。

本記事では、MintでインストールしたパッケージをBitriseにキャッシュさせる方法をご紹介します。



Bitriseのキャッシュの仕組み

Bitriseが提供しているCache:PullステップとCache:Pushステップの2つを使用することでキャッシュを利用することができます。


Cache:PushステップのCache pathsにキャッシュしたいファイルやフォルダのパスを指定することで、それらがキャッシュされます。

キャッシュを使いたい場合、ワークフローにCache:Pullステップを追加することで、事前にキャッシュしておいたファイルを使用することができます。

とりあえずこれだけ理解した上で、Bitriseのワークフローの具体例を見ていきましょう。


ワークフロー例

Xcodeでユニットテストを実行するためのワークフロー例がこちらです。
テスト実行時のビルドでSwiftLintが実行されるようになっているとします。


いくつかポイントを絞って説明します。

  • Cache:PullステップをGit Clone Repositoryステップの直後に配置します
  • Scriptステップでmint bootstrapを実行します
  • 最後にCache:Pushステップを配置します
  • Cache:PushステップのCache pathsに/usr/local/lib/mintを入力します
  • Cache:PushステップのCache pathsに~/.mintを入力します(2022/5/20追記 mint 1.7.0からパスが変わりました


~/.mintディレクトリ配下にMintでインストールしたパッケージのバイナリが保存されています。
例えばSwiftLintのバイナリは~/.mint/packages/github.com_realm_SwiftLint/build/x.x.x/swiftlintにあります。

Cache:Pushステップで~/.mintディレクトリをキャッシュさせることで、次回のビルドではCache:Pullステップでこのディレクトリがダウンロードされます。
SwiftLintのバイナリがすでにあるので、ScriptステップではSwiftLintのビルド処理は実行されないため、全体のビルド時間を短くすることができます。


キャッシュはブランチごとに作成される

キャッシュはブランチごとに作成されます。
そして、7日間そのブランチでビルドがされなければ、キャッシュは自動で削除されます。

また、ブランチにキャッシュがない場合は、デフォルトブランチのキャッシュが使用されます。
例えば、masterブランチがデフォルトブランチで、featureブランチをビルドしたときにキャッシュがない場合はmasterブランチのキャッシュが使用されます。


プルリクエストのビルドではキャッシュは保存されない

セキュリティ的な観点で、プルリクエストによってトリガーされたビルドではCache:Pushステップは実行されないようになっています。


例えばユニットテストのワークフローはプルリクエストによってトリガーされるように設定すると思いますが、それだとキャッシュが保存されないので、プルリクエスト作成前に一度手動でビルドしてキャッシュを作成しておく必要があります。

先述したようにビルドするブランチにキャッシュがない場合はデフォルトブランチのキャッシュが使用されるので、最初に手動でデフォルトブランチをビルドしておくと、その後のプルリクエストのビルドではデフォルトブランチのキャッシュが使用されるようになります。


参考

Caching | Bitrise DevCenter

zenn.dev