tool-cacheを使ったGitHub Actionsの効果的な構築・運用

tool-cacheを使ったGitHub Actionsの効果的な構築・運用

私はGitHub Actions上でWebブラウザのセットアップを行うActionを開発しています。

このActionは内部でtool-cacheという仕組みを利用しています。 またGitHubが公式で提供する setup-gosetup-node などもtool-cacheを利用しています。 この記事はGitHub Actions利用者やAction開発者向けに、tool-cacheを使ったCI/CDの効果的な構築・運用方法について紹介します。

tool-cacheとは

ジョブ高速化のために Cache action (actions/cache) を利用している人は多いと思いますが、tool-cacheとCache actionは異なるものです。 Cache actionは node_modulesvendor/bundle ディレクトリをキャッシュし、ジョブの実行時間を短縮します。 Cache actionはHTTP API経由でキャッシュの保存・取得をして、キャッシュデータをジョブ間で共有します。

tool-cacheのキャッシュの保存・取得先はファイルシステムで、キャッシュの内容もジョブ間で共有されません。 tool-cacheは成果物のキャッシュではなく、ジョブで利用するツールの初期化時間短縮のために利用します。 たとえばGitHub公式のRunner(GitHub-hosted Runner)は、予めGoやNode.jsなどが用意されています。 setup系Actionを使うときに用意されれているバージョンが存在すれば、ツールのダウンロード・インストールがスキップされます。

事前にインストールされたNode.js

tool-cacheへのアクセス

tool-cacheの保存先は $RUNNER_TOOL_CACHE 環境変数で指定されています。 GitHub-hosted RunnerのOSごとのパスは以下の通りです。

  • Linux: /opt/hostedtoolcache
  • macOS: /Users/runner/hostedtoolcache
  • Windows: C:/hostedtoolcache/windows

Action実装時にtool-cacheにアクセスするには、@actions/tool-cache パッケージを使います。 このパッケージはキャッシュの取得や保存に加え、HTTPダウンロードやアーカイブの展開などを行う機能を提供します。 例えば以下のコードは、ツール my-tool のバージョン 1.2.3 が存在するか調べ、存在しない場合はダウンロード・展開してキャッシュします。

import * as tc from '@actions/tool-cache';
import * as core from '@actions/core';

let toolPath = tc.find('my-tool', '1.2.3');
if (!toolPath) {
  const tarPath = await tc.downloadTool('https://...');
  const extractedPath = await tc.extractTar(tarPath, 'path/to/extract');
  toolPath = await tc.cacheDir(extractedPath, 'my-tool', '1.2.3');
}

// PATH に追加
core.addPath(toolPath);

GitHub-hosted Runnerに用意されているツール

GitHub-hosted Runnerには、利用頻度が高いツールが事前に用意されています。 v2.316.0$RUNNER_TOOL_CACHE 以下は以下のようになっていました。

/opt/hostedtoolcache/CodeQL/2.17.0
/opt/hostedtoolcache/go/1.20.14
/opt/hostedtoolcache/go/1.21.9
/opt/hostedtoolcache/go/1.22.2
/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/8.0.402-6
/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/11.0.22-7
/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.10-7
/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/21.0.2-13
/opt/hostedtoolcache/node/16.20.2
/opt/hostedtoolcache/node/18.20.2
/opt/hostedtoolcache/node/20.12.2
/opt/hostedtoolcache/PyPy/3.7.13
/opt/hostedtoolcache/PyPy/3.8.16
/opt/hostedtoolcache/PyPy/3.9.18
/opt/hostedtoolcache/PyPy/3.10.13
/opt/hostedtoolcache/Python/3.7.17
/opt/hostedtoolcache/Python/3.8.18
/opt/hostedtoolcache/Python/3.9.19
/opt/hostedtoolcache/Python/3.10.14
/opt/hostedtoolcache/Python/3.11.9
/opt/hostedtoolcache/Python/3.12.3
/opt/hostedtoolcache/Ruby/3.1.4

まとめ

tool-cacheはsetup系Actionでよく利用される機能です。 Self-hosted Runnerを運用する場合も、利用頻度の高いツールを事前に用意することで、ジョブの実行時間を短縮できます。 tool-cacheを知ることで、効果的なActionの開発や、CI/CDの構築・運用ができるようになるでしょう。


Profile picture

Shin'ya Ueoka

B2B向けSaaSを提供する会社の、元Webエンジニア。今はエンジニアリング組織のマネジメントをしている。