キャッシュ

Bitbucket Pipelines では、ビルド間で外部のビルド依存関係やディレクトリ (サードパーティ ライブラリなど) をキャッシュし、ビルドを高速化して、ビルド時間の消費を減らします。

依存関係のキャッシュとは

ほとんどのビルドでは、インターネット関係から依存関係をダウンロードするコマンドを最初に実行します。これにより、各ビルドで長い時間が必要になることがあります。依存関係のほとんどは変更されないため、依存関係を毎回ダウンロードするのではなくキャッシュに一度ダウンロードして、以降のビルドで再使用できるようにすることをおすすめします。

キャッシュのセットアップ

キャッシュを有効にするには、step セクションに caches を追加します。

Here's an example of how to cache your node_modules directory for a Node.js project using a pre-defined cache.

1 2 3 4 5 6 7 8 9 10 bitbucket-pipelines.yml pipelines: default: - step: caches: - node  script: - npm install - npm test

このパイプラインが初めて実行されるときにはノード キャッシュが見つからないため、npm コマンドによってインターネットから依存関係がダウンロードされます。以降のビルドでは、アトラシアンのサービスによって依存関係がキャッシュされるため、ビルドへのロード時間が短くなります。

事前定義済キャッシュ

Pipelines は、一般的に使用されている言語ツール用に事前定義済みのキャッシュ場所を提供します。

キャッシュ名

ステップ内での記載方法

ディレクトリ

Docker

1 2 caches: - docker

n/a -  ビルドにより生成されたレイヤーからキャッシュを作成します

composer

1 2 caches: - composer

~/.composer/cache

dotnetcore

1 2 caches: - dotnetcore

~/.nuget/packages

gradle

1 2 caches: - gradle

~/.gradle/caches

ivy2

1 2 caches: - ivy2

~/.ivy2/cache

Maven

1 2 caches: - maven

~/.m2/repository

node

1 2 caches: - node

node_modules

pip

1 2 caches: - pip

~/.cache/pip

sbt

1 2 3 caches: - sbt - ivy2

~/.sbt

~/.ivy2/cache

Note that when you use the sbt tool you need to enable both the sbt and ivy2 caches.

その他のビルド ツールやディレクトリ用のカスタム キャッシュ

If your build tool isn't listed above, you can still define a custom cache for your repository in your bitbucket-pipelines.yml file. First, in the definitions section of the yml, define the cache name and the directory to be cached, then you can refer to that cache in any step:

1 2 3 4 5 6 7 8 9 10 11 12 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

Ruby の場合、システムの gem リポジトリとは異なる場所に gem をインストールする必要があります。例:

 

1 $ bundle install --path vendor/bundle

複数のディレクトリのキャッシング

ビルドによっては、複数のディレクトリをキャッシュすることが効果がある場合があります。ステップでは、複数のキャッシュを次のように簡単に参照できます。

1 2 3 4 5 6 7 8 9 10 11 12 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 ページの右上にある [キャッシュ] を選択し、ゴミ箱アイコンを使用して一覧からキャッシュを破棄します。

べストプラクティス

依存関係のキャッシングは、同じファイルを何度もダウンロード/ビルドするのを防ぐことでビルド時間を短縮します。

つまり、次のような情報をキャッシュすることをおすすめします。

  • 言語固有の依存関係。

  • コンパイルに時間がかかる依存関係のバイナリ。

次の情報をキャッシュすることはおすすめしません。

  • パスワードや資格情報などの機密データ

注: Atlassian では symlink のキャッシュを保持しません。そのため、ご利用のデータが symlink に大きく依存している場合、キャッシュ作成を実行しても効果がない可能性があります。

キャッシュは一時的なものであることにご注意ください。キャッシュが存在するかどうかに関係なく機能するようにビルドを構成する必要があります。

その他のヘルプ