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
ステップは実行されないようになっています。
例えばユニットテストのワークフローはプルリクエストによってトリガーされるように設定すると思いますが、それだとキャッシュが保存されないので、プルリクエスト作成前に一度手動でビルドしてキャッシュを作成しておく必要があります。
先述したようにビルドするブランチにキャッシュがない場合はデフォルトブランチのキャッシュが使用されるので、最初に手動でデフォルトブランチをビルドしておくと、その後のプルリクエストのビルドではデフォルトブランチのキャッシュが使用されるようになります。