キャッシュの依存性

Bitbucket Pipelines では、ビルド間で、外部ビルド依存関係やディレクトリ (サードパーティ ライブラリなど) をキャッシュすることができます。

キャッシュは素早いビルドや開発者フィードバックを実現するだけでなく、消費されるビルド時間も短縮できます。


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

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

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

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

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

bitbucket-pipelines.yml
pipelines:
  default:
    - step:
        caches:
          - node
        script:
          - npm install
          - npm test

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

事前定義済キャッシュ

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

キャッシュ名 ステップ内での記載方法 ディレクトリ
Docker
caches:
- docker
n/a -  ビルドにより生成されたレイヤーからキャッシュを作成します
composer
caches:
- composer
~/.composer/cache
dotnetcore
caches:
- dotnetcore
~/.nuget/packages
gradle
caches:
- gradle
~/.gradle/caches
ivy2
caches:
- ivy2
~/.ivy2/cache
Maven
caches:
- maven
~/.m2/repository
node
caches:
- node
node_modules
pip
caches:
- pip
~/.cache/pip
sbt
caches:
- sbt
- ivy2

~/.sbt

~/.ivy2/cache

sbt ツールを使用する場合、sbt と ivy2 キャッシュの両方を有効化する必要があることにご注意ください。


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

お使いのビルド ツールが上記に記載されていない場合も、bitbucket-pipelines.yml ファイルでリポジトリ用のカスタム キャッシュを定義できます。最初に、yml の definitions セクションでキャッシュ名とキャッシュするディレクトリを定義します。次に、任意のstepでそのキャッシュを参照します。

bitbucket-pipelines.yml
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 をインストールする必要があります。例:


$ bundle install --path vendor/bundle

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

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

bitbucket-pipelines.yml
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 に大きく依存している場合、キャッシュ作成を実行しても効果がない可能性があります。

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

最終更新日 2018 年 8 月 3 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.