しばやん雑記

ASP.NET Core とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Pipelines の Pipeline Caching (Preview) を試してみた

Azure Pipelines の弱点としてキャッシュが使えないことがちょいちょい言われているみたいですが、最近になってキャッシュ用のタスクがプレビューとして公開されたようです。

2 月ぐらいに開発が始まったようですが、まあまあ時間がかかりましたね。

ドキュメントがひっそりと追加されているので、読めば大体のパッケージマネージャ周りでの設定を学ぶことが出来ます。割と充実した内容となっているので、特に説明も不要な感じです。

何故か NuGet に関しては記載がないですが、元々メジャーなパッケージはキャッシュされているので、あまり効果が出なかったのかも知れません。

ドキュメントにある通り CacheBeta@0 というタスクが追加されています。

YAML と Classic Editor の両方で Cache と検索すると出てくるので、見つけやすいはずです。

f:id:shiba-yan:20190720082718p:plain

設定自体はキャッシュキーと対象のパスを設定するぐらいなので簡単です。

VuePress で作っているサイトは npm を使っているので、ドキュメントに書いてある通りの設定を追加して動作と効果を試しておきました。

Pipeline Caching を有効にした YAML は以下のようになりました。

variables:
  npm_config_cache: $(Pipeline.Workspace)/.npm

steps:
- task: NodeTool@0
  inputs:
    versionSpec: '10.x'
  displayName: 'Install Node.js'

- task: CacheBeta@0
  inputs:
    key: $(Build.SourcesDirectory)/package-lock.json
    path: $(npm_config_cache)
  displayName: Cache npm

- script: |
    npm ci
    npm run build -- --dest dist
  displayName: 'npm ci and build'

最近は node_modules ではなく .npm をキャッシュしつつ、npm ci を使うのが良いと知りました。

これでビルドを行うと、キャッシュにヒットした場合は復元が行われます。npm なのでファイル数は結構多いはずですが、処理は比較的短時間で終わりました。

f:id:shiba-yan:20190720084300p:plain

内部で CacheBeta@0 を使うようにしておくと、自動的に Post-job が追加されてキャッシュが保存されます。

キャッシュキーが変化していない場合はスキップされるので安心です。

f:id:shiba-yan:20190720084449p:plain

Fingerprint が同じでも PR と master 間でキャッシュがヒットしなかったりと少し謎な挙動もありますが、やっと他の CI SaaS が当たり前に持っている機能が Azure Pipelines でも使えるようになってきました。

キャッシュの効果

まだプレビューなので意味はない気がしますが、キャッシュの有無での処理時間の違いを簡単に調べました。

Cache あり Cache なし
npm install / ci 5-7sec 30-35sec
キャッシュにかかる時間 10-12sec 0sec

正直なところ、VuePress ぐらいしか使ってないリポジトリだと効果はあまりなさそうです。

もうちょっと大量のパッケージを参照してる場合には差が出るのかも知れません。インストール時にビルドが必要なパッケージの場合は特に期待できそうです。

f:id:shiba-yan:20190720091003p:plain

Pipeline Analysis を見ると、ちょびっとだけ改善はしているようでした。

とは言ってもキャッシュの保存と復元はそれなりに重たい処理にはなるので、何も考えずに設定というのは止めた方が良さそうです。