Karappoでは、DroneというオープンソースのCIを使っています。Dockerイメージが用意されているので簡単にインストールできるし、非常に便利です。DigitalOceanへのインストールの仕方はこちらを御覧ください。
このDroneは、ビルド毎に指定されたDockerのContainerが立つので(前回ビルド時の環境からは完全に切り離されている状態のため)、例えばRailsのプロジェクトをCIしたい時などに、bundle installを実行すると、その度にダウンロード時間がかかることになります。これはnpmなど他のパッケージマネージャーを使っている場合でも同じです。毎回パッケージのインストールはしたくない、かと言ってビルドに使うDockerイメージ自体に依存ライブラリを入れちゃうと変更が効かなくなるし、どうしたらよいのかなーと思っていました。
理想的には、ローカルでbundle installする場合は、既にインストール済みのパッケージは無視して新しいパッケージのみダウンロードするので、そんな感じにしたいです。そこで、ドキュメントを読んでいるとCachingという項目があるのに気付きました。これを使うと、まさに上で書いたように差分を見てダウンロードしてくれるようにできるはずです。なので、早速試してみました。
例えば、こんな感じの.drone.ymlだった場合、
build:
image: hoge/hoge
commands:
- bundle install --path=vendor/bundle --binstubs=vendor/bin
- RAILS_ENV=test bundle exec rake db:create db:migrate
- bundle exec rspec
このように、cache > mountのリストにキャッシュしたいディレクトリを指定を追加してやるだけです。
build:
image: hoge/hoge
commands:
- bundle install --path=vendor/bundle --binstubs=vendor/bin
- RAILS_ENV=test bundle exec rake db:create db:migrate
- bundle exec rspec
cache:
mount:
- vendor
この場合だと、vendor以下にgemをインストールしているのでこんな感じになります。プロジェクトディレクトリ外のディレクトリをキャッシュする場合は、注意が必要みたいでドキュメントに詳しく書いてあるので見ておいてください。
これで、こんなログだったのが、
$ bundle install --path=vendor/bundle --binstubs=vendor/bin
...
Installing rake 10.5.0
Installing CFPropertyList 2.3.2
Installing i18n 0.7.0
...
こんな感じでInstallingがUsingに代わって、ビルドが高速化されているのが確認できます。
$ bundle install --path=vendor/bundle --binstubs=vendor/bin
...
Using rake 10.5.0
Using CFPropertyList 2.3.2
Using i18n 0.7.0
...
この記事は2016.4.7にこちらのURLで公開していた内容を移行しました。