キャッシュ

Bitbucket Pipelines では、ビルドの依存関係やディレクトリのキャッシングをサポートし、ビルドの高速化と消費されるビルド時間の削減を実現しています。

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

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

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

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

pre-defined キャッシュを使用して Node.js プロジェクトの node_modules ディレクトリをキャッシュする方法の例は、次のとおりです。

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

注意: sbt ツールを使用する場合、sbt と ivy2 キャッシュの両方を有効にする必要があります。

1 2 3 caches: - sbt - ivy2

~/.sbt

~/.ivy2/cache

定義済みのキャッシュは、ファイルベースのキャッシュ キーをサポートしません。キャッシュされたコンテンツをより適切に管理するには、 ファイルベースのキャッシュ キーでカスタム キャッシュを定義します。

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

ご利用のビルド ツールが上記に記載されていない場合も、bitbucket-pipelines.yml ファイルでリポジトリ用のカスタム キャッシュを定義できます。

カスタム キャッシュはファイルベースのキャッシュ キーをサポートできます。ファイルベースのキャッシュ キーを使用すると、一連のファイルに基づいてキャッシュを生成/復元できます。いずれかのファイルが変更されると、新しいキャッシュが作成されます。典型的なユース ケースとしては、プロジェクトの依存関係を定義するファイルに基づいたキャッシュ キーの定義が考えられます。依存関係に変更がない場合、Pipelines はキャッシュされた依存関係をキャッシュから復元できます。依存関係が更新されると、キャッシュ キー ファイルの内容が変更され、Pipelines が新しいバージョンのキャッシュを作成します。

  • まず、.yml ファイルの定義セクションで、どのステップでもキャッシュを参照できるようにキャッシュ名を定義します。

  • 次に、キャッシュを使用するかどうかを決定する際に Pipelines が変更をチェックする一連の files を定義します。これを key と呼びます。

    • ファイルの内容が変更されている場合は、新しい依存関係または更新された依存関係が使用されていることを示します。Pipelines は新しい依存関係をダウンロードします。

  • 最後に、path プロパティでキャッシュするディレクトリを指定します。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 definitions: caches: my-bundler-cache: key: files: # the files you want pipelines to check for changes when deciding whether to use the cache, or download fresh dependencies. - Gemfile.lock - "**/*.gemspec" # glob patterns are supported for cache key files path: vendor/bundle # the directory you want to be cached. pipelines: default: - step: caches: - my-bundler-cache # Cache is defined above in the definitions section script: - bundle install --path vendor/bundle - ruby -e 'print "Hello, World\n"'

定義されているキャッシュは、最初に成功したビルドの後で保存されます。

キャッシュのディレクトリ パスは、クローン ディレクトリに対して絶対/相対に指定できます。例:

  • $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 definitions: caches: bundler: vendor/bundle pipelines: default: - step: caches: - bundler #cache is defined above in the definitions section script: - bundle install --path vendor/bundle

ファイルベースのキャッシュ キーによるキャッシング

カスタム キャッシュは、基本的な「cache-name: /path」設定の代わりとしてファイルベースのキャッシュ キーをサポートできます。ファイルベースのキャッシュ キーを使用すると、一連のファイルに基づいてキャッシュを生成および復元できます。いずれかのファイルが変更されると、新しいキャッシュが作成されます。

典型的なユース ケースとしては、プロジェクトの依存関係を定義するファイルに基づいたキャッシュ キーの定義が考えられます。Pipelines では、キャッシュされた依存関係をキャッシュから復元できるため、外部ソースからの取得が不要で、ビルドの時間を節約できます。依存関係がアップデートされると、キャッシュ キー ファイルのハッシュが変更され、Pipelines は新しいバージョンのキャッシュを作成します。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 definitions: caches: my-bundler-cache: key: files: - Gemfile.lock - "**/*.gemspec" # glob patterns are supported for cache key files path: vendor/bundle pipelines: default: - step: caches: - my-bundler-cache # Cache is defined above in the definitions section script: - bundle install --path vendor/bundle - ruby -e 'print "Hello, World\n"'

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

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

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 のスクリプトに次のコマンドを追加すると、サイズを確認できます。

1 docker image inspect $(docker image ls -aq) --format {{.Size}} | awk '{totalSizeInBytes += $0} END {print totalSizeInBytes}'

キャッシュはいつ復元されますか。

保存されたキャッシュが利用可能で、対象のディレクトリに配置されている場合、各ビルドの最初にダウンロードされます。

キャッシュはいつクリアされますか。

キャッシュは生成から 1 週間が経過すると、自動的にクリアされ、次回のビルド中に再生成されます。キャッシュは Bitbucket UI から手動でクリアすることもできます。Pipelines ページの右上にある [キャッシュ] を選択し、ゴミ箱アイコンを使用して一覧からキャッシュを破棄します。

べストプラクティス

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

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

  • 言語固有の依存関係。

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

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

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

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

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

その他のヘルプ