Travis CIでCarthageのビルドをキャッシュして幸せになる
目的
- Travis CIのPull RequestビルドでCarthageを毎回ビルドしない
- git repositoryにCarthageのビルド成果物をコミットしないで実現する
Pull Requestビルドの概要
公式ドキュメントを覗いてみます。
Caching Dependencies and Directories - Travis CI
Pull Requestのビルドは以下のキャッシュを確認して最初に見つかったものを利用する。
- 対象のPull Requestのキャッシュ
- 対象のPull Requestのターゲットブランチのキャッシュ
- git repositoryのデフォルトブランチのキャッシュ
もし上記すべてのキャッシュが存在しない場合はキャッシュなしでビルドが実行される。
最初のPull Requestビルドが終了した後に、新しくPull Requestキャッシュが作成される。(つまり上記リストの1.はPull Requestの初回ビルドでは存在しない)
やってみる
- ターゲットブランチ:
develop
(ブランチキャッシュはすでに存在) - デフォルトブランチ:
master
.travis.yml
cache: directories: - Carthage
featureブランチ -> develop へPRを作成します。 キャッシュが効いていたらCarthageのビルドが走らないため6分程度で終わるはずです。
...時間がかかり過ぎています。
原因を特定するためにTravisのログを見てみます。
Setting up build cache $ export CASHER_DIR=$HOME/.casher $ Installing caching utilities attempting to download cache archive fetching PR.118/cache-osx-xcode9.3-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855--rvm-default--gemfile-Gemfile.tgz fetching PR.118/cache--rvm-default--gemfile-Gemfile.tgz fetching master/cache-osx-xcode9.3-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855--rvm-default--gemfile-Gemfile.tgz fetching master/cache--rvm-default--gemfile-Gemfile.tgz could not download cache
fetching... の内容がキャッシュの存在確認のようですが、Pull Requestキャッシュとmasterブランチキャッシュしか確認してないように見えます。
公式ドキュメントの内容が正だとしたらTravis CIのバグのような気がしますが、とりあえずdevelopブランチをデフォルトブランチに設定して別のPRを試してみます。(同じPRだとすでにPull Requestキャッシュが作成されてしまって検証にならないため)
17分から6分に短縮することができました。
Travisのログを見てみてもdevelopブランチのキャッシュを確認していることが分かります。
Setting up build cache $ export CASHER_DIR=$HOME/.casher $ Installing caching utilities attempting to download cache archive fetching PR.124/cache-osx-xcode9.3-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855--rvm-default--gemfile-Gemfile.tgz fetching PR.124/cache--rvm-default--gemfile-Gemfile.tgz fetching develop/cache-osx-xcode9.3-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855--rvm-default--gemfile-Gemfile.tgz found cache
結論
- Travis CIのPull Requestビルドはターゲットブランチのブランチキャッシュを確認してくれない
- 公式ドキュメントが正だとしたら上記の挙動はTravis CIのバグの可能性
- git repositoryのデフォルトブランチをうまく設定することで、初回ビルドからTravis CIのキャッシュ機構の恩恵を受けることができる(今回の例ではdevelopを利用しましたがmasterでもビルドするような環境の場合はmasterでも大丈夫なはず)
また以前別エントリで記載したように、CI時のビルド時間短縮の観点から、Carthageを利用するアプリでCarthageフォルダをgit repositoryにコミットするか否か迷っていましたが、Travis CIを利用する場合はキャッシュ機構が備わっているためgit repositoryにコミットしなくて済みrepositoryをクリーンに保てるので良いですね。