キャッシュの依存性
Bitbucket Pipelines では、ビルド間で外部のビルド依存関係やディレクトリ (サードパーティ ライブラリなど) をキャッシュし、ビルドを高速化して、ビルド時間の消費を削減できます。
依存関係のキャッシュとは
ほとんどのビルドでは、インターネット関係から依存関係をダウンロードするコマンドを最初に実行します。これにより、各ビルドで長い時間が必要になることがあります。依存関係のほとんどは変更されないため、依存関係を毎回ダウンロードするのではなくキャッシュに一度ダウンロードして、以降のビルドで再使用できるようにすることをおすすめします。
キャッシュのセットアップ
キャッシュを有効にするには、step
セクションに caches
を追加します。
pre-defined キャッシュを使用して Node.js プロジェクトの node_modules
ディレクトリをキャッシュする方法の例は、次のとおりです。
pipelines:
default:
- step:
caches:
- node
script:
- npm install
- npm test
このパイプラインが初めて実行されるときにはノード キャッシュが見つからないため、npm コマンドによってインターネットから依存関係がダウンロードされます。以降のビルドでは、アトラシアンのサービスによって依存関係がキャッシュされるため、ビルドへのロード時間が短くなります。
事前定義済キャッシュ
Pipelines は、一般的に使用されている言語ツール用に事前定義済みのキャッシュ場所を提供します。
キャッシュ名 | ステップ内での記載方法 | ディレクトリ |
---|---|---|
Docker | caches: | n/a - ビルドにより生成されたレイヤーからキャッシュを作成します |
composer | caches: | ~/.composer/cache |
dotnetcore | caches: | ~/.nuget/packages |
gradle | caches: | ~/.gradle/caches
|
ivy2 | caches: | ~/.ivy2/cache |
Maven | caches: | ~/.m2/repository |
node | caches: | node_modules |
pip | caches: | ~/.cache/pip |
sbt | caches: |
|
sbt
ツールを使用する場合、sbt と ivy2 キャッシュの両方を有効化する必要があることにご注意ください。
その他のビルド ツールやディレクトリ用のカスタム キャッシュ
お使いのビルド ツールが上記に記載されていない場合も、bitbucket-pipelines.yml ファイルでリポジトリ用のカスタム キャッシュを定義できます。最初に、yml の definitions
セクションでキャッシュ名とキャッシュするディレクトリを定義します。次に、任意のstep
でそのキャッシュを参照します。
image: ruby:2.4.0
pipelines:
default:
- step:
caches:
- bundler #cache is defined below in the definitions section
script:
- bundle install --path vendor/bundle
definitions:
caches:
bundler: vendor/bundle
定義されているキャッシュは、最初に成功したビルドの後で保存されます。
キャッシュのディレクトリ パスは、クローン ディレクトリに対して絶対/相対に指定できます。例:
$HOME/.npm
~/.gradle/wrapper
/usr/local/lib/node_modules
vendor/bundle
$ bundle install --path vendor/bundle
複数のディレクトリのキャッシング
ビルドによっては、複数のディレクトリをキャッシュすることが効果がある場合があります。ステップでは、複数のキャッシュを次のように簡単に参照できます。
image: openjdk:8
pipelines:
default:
- step:
caches:
- gradle # pre-defined cache
- gradlewrapper # custom cache that must be defined below
script:
- ./gradlew build
definitions:
caches:
gradlewrapper: ~/.gradle/wrapper
キャッシングのしくみ
キャッシュはいつ保存されますか。
キャッシュが空の場合、ビルドに成功するとキャッシュが保存されます。1 GB 未満に圧縮されたキャッシュのみが保存されます。
キャッシュを 1 GB 未満に圧縮するには、docker デーモンの元のイメージのサイズを 2 GB 未満にする必要があります。bitbucket-pipelines.yml
のスクリプトに次のコマンドを追加すると、サイズを確認できます。
docker image inspect $(docker image ls -aq) --format {{.Size}} | awk '{totalSizeInBytes += $0} END {print totalSizeInBytes}'
キャッシュはいつ復元されますか。
保存されたキャッシュが利用可能で、対象のディレクトリに配置されている場合、各ビルドの最初にダウンロードされます。
キャッシュはいつクリアされますか。
1 週間が経過したキャッシュは自動的にクリアされ、次回のビルド中に再生成されます。さらに、キャッシュは Bitbucket の UI から手動でクリアできます。Pipelines ページの右上にある [キャッシュ] を選択し、ゴミ箱アイコンを使用して一覧からキャッシュを破棄します。
キャッシュすべき対象について
依存関係のキャッシングは、同じファイルを何度もダウンロード/ビルドするのを防ぐことでビルド時間を短縮します。
つまり、次のような情報をキャッシュすることをおすすめします。
- 言語固有の依存関係。
- コンパイルに時間がかかる依存関係のバイナリ。
次の情報をキャッシュすることはおすすめしません。
- パスワードや資格情報などの機密データ
注: アトラシアンでは symlink のキャッシュを保持しません。そのため、ご利用のデータが symlink に大きく依存している場合、キャッシュ作成を実行しても効果がない可能性があります。
キャッシュは一時的なものであることにご注意ください。キャッシュが存在するかどうかに関係なく機能するようにビルドを構成する必要があります。