Azure Pipelines の弱点としてキャッシュが使えないことがちょいちょい言われているみたいですが、最近になってキャッシュ用のタスクがプレビューとして公開されたようです。
2 月ぐらいに開発が始まったようですが、まあまあ時間がかかりましたね。
ドキュメントがひっそりと追加されているので、読めば大体のパッケージマネージャ周りでの設定を学ぶことが出来ます。割と充実した内容となっているので、特に説明も不要な感じです。
何故か NuGet に関しては記載がないですが、元々メジャーなパッケージはキャッシュされているので、あまり効果が出なかったのかも知れません。
ドキュメントにある通り CacheBeta@0
というタスクが追加されています。
YAML と Classic Editor の両方で Cache と検索すると出てくるので、見つけやすいはずです。
設定自体はキャッシュキーと対象のパスを設定するぐらいなので簡単です。
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 なのでファイル数は結構多いはずですが、処理は比較的短時間で終わりました。
内部で CacheBeta@0
を使うようにしておくと、自動的に Post-job が追加されてキャッシュが保存されます。
キャッシュキーが変化していない場合はスキップされるので安心です。
Fingerprint が同じでも PR と master 間でキャッシュがヒットしなかったりと少し謎な挙動もありますが、やっと他の CI SaaS が当たり前に持っている機能が Azure Pipelines でも使えるようになってきました。
キャッシュの効果
まだプレビューなので意味はない気がしますが、キャッシュの有無での処理時間の違いを簡単に調べました。
Cache あり | Cache なし | |
---|---|---|
npm install / ci | 5-7sec | 30-35sec |
キャッシュにかかる時間 | 10-12sec | 0sec |
正直なところ、VuePress ぐらいしか使ってないリポジトリだと効果はあまりなさそうです。
もうちょっと大量のパッケージを参照してる場合には差が出るのかも知れません。インストール時にビルドが必要なパッケージの場合は特に期待できそうです。
Pipeline Analysis を見ると、ちょびっとだけ改善はしているようでした。
とは言ってもキャッシュの保存と復元はそれなりに重たい処理にはなるので、何も考えずに設定というのは止めた方が良さそうです。