🎚️

GitHub Actions のキャッシュを管理

2022/08/01に公開

少し前、久々に GitHub Actions でキャッシュの設定を作ろうとしたところ「想定したようにキャッシュができているかの確認がちょっと大変」と感じました。そのようなときに、キャッシュ管理用の extension が公開されたのでその辺を少し。

API を使う

まずは extension ではなく GitHub の API を使ってリポジトリのキャッシュを管理する場合について。

GitHub API の利用方法はいくつかありますが、今回は簡単に GitHub CLI から利用してみます。

使用量の確認

どれくらい利用しているかの確認です。

$ gh api -H "Accept: application/vnd.github+json" "/repos/{owner}/{repo}/actions/cache/usage"
{
  "full_name": "hankei6km/xquo",
  "active_caches_size_in_bytes": 10572695430,
  "active_caches_count": 58
}

一覧表示

新しい設定でキャッシュを作成したとき「キーの設定などがうまくいっているか」の確認をしたくなります。そのようなときに利用します。

図 1-1 API でリポジトリのキャッシュ一覧を表示

$ gh api -H "Accept: application/vnd.github+json" "/repos/{owner}/{repo}/actions/caches"                           
{                                                                                                                     
  "total_count": 43,                                                                                                  
  "actions_caches": [                                                                                                 
    {                                                                                                                 
      "id": 81,                                                                                                       
      "ref": "refs/heads/main",                                                                                       
      "key": "Windows-install-b0ca1dec0c00f9f3444c0b897b128153c05286105c0fbdade5753f42a5e9c533",                      
      "version": "ec0fe727cf292ba34588c5de04f72efd6f7301ff9bb3ce383753f7b108f30051",                                  
      "last_accessed_at": "2022-07-31T10:39:20.456666700Z",                                                           
      "created_at": "2022-07-26T07:40:25.280000000Z",                                                                 
      "size_in_bytes": 174681688                                                                                      
    },                                                                                                                
    {                                                                                                                 
      "id": 90,                                                                                                       
      "ref": "refs/heads/topic/fix-wrong-cache-key",                                                                  
      "key": "Linux-cargo-clippy-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6",                   
      "version": "4464b218375e2702da53c92c2e51ffdd3cdd5aeba23dec304d9c1239b4ef594a",                                  
      "last_accessed_at": "2022-07-31T10:39:06.903333300Z",                                                           
      "created_at": "2022-07-30T07:05:09.946666700Z",                                                                 
      "size_in_bytes": 181828878                                                                                      
    },

    # snip...

必要な項目だけ表示する場合。jq のオプションで指定できます。

図 1-2表示する項目を指定

$ gh api -H "Accept: application/vnd.github+json" "/repos/{owner}/{repo}/actions/caches" --jq ".actions_caches[] | {id, key, last_accessed_at, ref}"                                 
{"id":81,"key":"Windows-install-b0ca1dec0c00f9f3444c0b897b128153c05286105c0fbdade5753f42a5e9c533","last_accessed_at":"2022-07-31T10:39:20.456666700Z","ref":"refs/heads/main"}                                                              
{"id":90,"key":"Linux-cargo-clippy-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:39:06.903333300Z","ref":"refs/heads/topic/fix-wrong-cache-key"}
{"id":79,"key":"Linux-install-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:39:00.980000000Z","ref":"refs/heads/main"}  
{"id":91,"key":"Linux-cargo-test_release_jemalloc-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:39:00.900000000Z","ref":"refs/heads/topic/fix-wrong-cache-key"}
{"id":89,"key":"Linux-cargo-test_release-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:39:00.106666700Z","ref":"refs/heads/topic/fix-wrong-cache-key"}
# snip...

ref での絞り込みもできます。「作業中のプルリクエストで操作したキャッシュ」の確認に便利です。

図 1-3表示する項目を指定

$ gh api -H "Accept: application/vnd.github+json" "/repos/{owner}/{repo}/actions/caches?ref=refs/heads/topic/fix-wrong-cache-key" --jq ".actions_caches[] | {id, key, last_accessed_at}"
{"id":90,"key":"Linux-cargo-clippy-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:39:06.903333300Z"}
{"id":91,"key":"Linux-cargo-test_release_jemalloc-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:39:00.900000000Z"}
{"id":89,"key":"Linux-cargo-test_release-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:39:00.106666700Z"}
{"id":88,"key":"Linux-cargo-test_debug-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:38:56.250000000Z"}

キャッシュの削除

間違えて作ってしまったキャッシュを削除したいときに利用します。こちらも ref などで対象を指定できますが、id を使うのがお手軽でよいかと思います。

図 1-4 id が 90 のキャッシュを削除

$ gh api --method DELETE -H "Accept: application/vnd.github+json" /repos/{owner}/{repo}/actions/caches/90

$ gh api -H "Accept: application/vnd.github+json" "/repos/{owner}/{repo}/actions/caches?ref=refs/heads/topic/fix-wrong-cache-key" --jq ".actions_caches[] | {id, key, last_accessed_at}"
{"id":91,"key":"Linux-cargo-test_release_jemalloc-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:39:00.900000000Z"}
{"id":89,"key":"Linux-cargo-test_release-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:39:00.106666700Z"}
{"id":88,"key":"Linux-cargo-test_debug-745cab0288fc37d8864b0178ed01e0dc115354d51702a55b62bc511f28d37ef6","last_accessed_at":"2022-07-31T10:38:56.250000000Z"}

ただし、 Codespaces で自動的に付与される GITHUB_TOKEN ではエラーになります。

図 1-5 Codespaces ではエラーになる

$ gh api --method DELETE -H "Accept: application/vnd.github+json" /repos/{owner}/{repo}/actions/caches/90
{
  "message": "Resource not accessible by integration",
  "documentation_url": "https://docs.github.com/rest/actions/cache#delete-a-github-actions-cache-for-a-repository-using-a-cache-id"
}
gh: Resource not accessible by integration (HTTP 403)

gh-actions-cache

API でもそれなりに利用できますがやはり少し面倒です。今度は extension を利用してみます。

インストール

extension なので GitHub CLI 環境にインストールする必票があります。とはいっても下記のコマンド実行するだけです[1]

図 2-1 インストールコマンド

$ gh extension install actions/gh-actions-cache

使用量と一覧表示

list コマンドで表示されます。このコマンドでは使用量もあわせて表示されます。

図 2-2 一覧表示

$ gh actions-cache list --limit 10
Total caches size 7.24 GB

Showing 10 of 43 cache entries in hankei6km/xquo

Linux-cargo-test_release_jemalloc-745cab0288fc37d8... [203.50 MB]     refs/heads/to...  4 hours ago        
Linux-cargo-clippy-745cab0288fc37d8864b0178ed01e0d... [173.41 MB]     refs/heads/to...  4 hours ago        
Linux-cargo-test_release-745cab0288fc37d8864b0178e... [136.02 MB]     refs/heads/to...  4 hours ago        
Linux-cargo-test_debug-745cab0288fc37d8864b0178ed0... [170.82 MB]     refs/heads/to...  4 hours ago        
Windows-install-b0ca1dec0c00f9f3444c0b897b128153c0... [166.59 MB]     refs/heads/main   4 hours ago        
Linux-install-745cab0288fc37d8864b0178ed01e0dc1153... [204.45 MB]     refs/heads/main   4 hours ago        
Linux-x86_64-unknown-linux-musl-cargo-745cab0288fc... [176.99 MB]     refs/tags/v0.2.0  4 days ago         
Linux-x86_64-pc-windows-gnu-cargo-745cab0288fc37d8... [118.54 MB]     refs/tags/v0.2.0  4 days ago         
Linux-cargo-$test_release_jemalloc-745cab0288fc37d... [203.51 MB]     refs/heads/main   4 days ago         
Linux-publish-745cab0288fc37d8864b0178ed01e0dc1153... [133.08 MB]     refs/tags/v0.2.0  4 days ago

API の ref と同じようにブランチ名での絞り込みもできます。

図 2-3 ブランチ名での絞り込み

$ gh actions-cache list --branch topic/fix-wrong-cache-key
Showing 3 of 3 cache entries in hankei6km/xquo

Linux-cargo-test_release_jemalloc-745cab0288fc37d8... [203.50 MB]     refs/heads/to...  2 days ago
Linux-cargo-test_release-745cab0288fc37d8864b0178e... [136.02 MB]     refs/heads/to...  2 days ago
Linux-cargo-test_debug-745cab0288fc37d8864b0178ed0... [170.82 MB]     refs/heads/to...  2 days ago

キーでの絞り込みもできますが、GLOB などは使えないようです。

図 2-4 キーでの絞り込みを試す

$ gh actions-cache list --limit 10 --key windows
Showing 6 of 6 cache entries in hankei6km/xquo

Windows-install-b0ca1dec0c00f9f3444c0b897b128153c0... [166.59 MB]     refs/heads/main   4 hours ago        
Windows-install-f0fe93585e34ba5d2b2a8fcfe58bac58ac... [164.25 MB]     refs/heads/main   4 days ago         
Windows-install-f0fe93585e34ba5d2b2a8fcfe58bac58ac... [164.26 MB]     refs/heads/de...  5 days ago         
Windows-install-fd8e39df0ffc26a77d1c14ef70e41736dc... [164.24 MB]     refs/heads/main   5 days ago         
Windows-install-fd8e39df0ffc26a77d1c14ef70e41736dc... [164.10 MB]     refs/heads/de...  5 days ago         
Windows-install-fb7c9cbf667a82540d3d444f3e547b3291... [164.08 MB]     refs/heads/de...  5 days ago         

$ gh actions-cache list --limit 10 --key install
There are no Actions caches currently present in this repo or for the provided filters

$ gh actions-cache list --limit 10 --key "*install*"
There are no Actions caches currently present in this repo or for the provided filters

なお、表示項目の変更などはできないようです。

こう書くと良くない印象になりそうですが、表示は見やすいのでキー指定のミスなどは発見しやすいです。実際、キーに余分な $ を含めていたのを見つけてしまいました。

削除

delete コマンドで削除できますがキーを指定する必票があります。部分一致ではエラーになるので、list コマンドでキーを確認する場合は省略されないようにする必要があります。ちょっと削除したいときの利用では少し面倒かもしれません。

図 2-5 削除はキーを利用する

$ gh actions-cache list --limit 10 --key windows
Showing 6 of 6 cache entries in hankei6km/xquo

Windows-install-b0ca1dec0c00f9f3444c0b897b128153c05286105c0fbdade5753f42a5e9c533                        [166.59 MB]     refs/heads/main                  5 hours ago        
Windows-install-f0fe93585e34ba5d2b2a8fcfe58bac58ac56ab2810e67109118e4dd176c11b49                        [164.25 MB]     refs/heads/main                  4 days ago         
Windows-install-f0fe93585e34ba5d2b2a8fcfe58bac58ac56ab2810e67109118e4dd176c11b49                        [164.26 MB]     refs/heads/dependabot/cargo/...  5 days ago         
Windows-install-fd8e39df0ffc26a77d1c14ef70e41736dcc0444514249786fbcbdfd6c838c386                        [164.24 MB]     refs/heads/main                  5 days ago         
Windows-install-fd8e39df0ffc26a77d1c14ef70e41736dcc0444514249786fbcbdfd6c838c386                        [164.10 MB]     refs/heads/dependabot/cargo/...  5 days ago         
Windows-install-fb7c9cbf667a82540d3d444f3e547b32919a2c6fc8621caa7eadf7e6aa111f46                        [164.08 MB]     refs/heads/dependabot/cargo/...  5 days ago         

$ gh actions-cache delete Windows-install-fb7c9cbf667a82540d3d444f3e547b32919a2c6fc8621caa7eadf7e6aa111f46
You're going to delete 1 cache entry

Windows-install-fb7c9cbf667a82540d3d444f3e547b32919a2c6fc8621caa7eadf7e6aa111f46                        [164.08 MB]     refs/heads/dependabot/cargo/...  5 days ago         

? Are you sure you want to delete the cache entries?  [Use arrows to move, type to filter]
> Delete
  Cancel

delete については実際の利用に便利そうな改善案などが出ているので、そちらに期待といった感じでしょうか。

おわりに

GitHub Actions のキャッシュ管理について見てみました。

ワークフローのキャッシュは動いてしまえば気にする機会も減ります。ですが「初めて使う言語用に依存関係をキャッシュする」「Docker のビルドキャッシュを設定する」ような場合には確認や削除がしたくなります。

そのようなとき「どうやって確認するんだっけ?」となりがちなので、 gh-actions-cache list のお手軽な使いやすさはありがたい存在となりそうです。

脚注
  1. gh コマンドは GitHub へログインしてる必要があります。よって Dockerfile へ単純にコマンドを記述してもインストールできません。Dev Contaioenr へインストールする場合は、postStartCommand などを使うのが楽かと思います。 ↩︎

GitHubで編集を提案

Discussion