Github ActionsでtoolがキャッシュHitしない
カスタムアクションを開発中
以下のコードSwiftのパッケージを持ってきてtoolCacheしているが、次回以降の実行でtoolCachefind
でPathがHitしない
const { platformName, pkgName } = await getPakage("5.10");
let toolPath = toolCache.find("swift", "5.10");
if (!toolPath) {
const { pkgURL, signatureURL } = await getDownloadURL(
swiftVersion,
platformName,
pkgName,
);
const { downloadPath, signaturePath } = await downloadSwift(
pkgURL,
signatureURL,
);
await verifySwift(downloadPath, signaturePath);
const extractPath = await unpack(downloadPath, pkgName);
toolPath = await toolCache.cacheDir(
path.join(extractPath, pkgName),
"swift",
swiftVersion,
);
}
const binPath = path.join(toolPath, "/usr/bin");
core.addPath(binPath);
想定動作としては、
-
toolCache.cacheDir
でtoolCacheのパスにSwiftのディレクトリがコピーされる - 次のActions実行時に
toolCache.find("swift", "5.10");
でtoolPathが参照できる
しかし、SwiftはインストールされているがtoolCache.find("swift", "5.10");
でパスが取得できない事象が発生した
原因
セマンティック バージョニングではなかったため発生した
tool_cache.find()
のコードを見てみるとisExplicitVersion
でバージョンをバリデーションしている。
5.10
はセマンティック バージョニングではないため、versionがnullになりうまくCacheHitしない。
function find(toolName, versionSpec, arch) {
if (!toolName) {
throw new Error('toolName parameter is required');
}
if (!versionSpec) {
throw new Error('versionSpec parameter is required');
}
arch = arch || os.arch();
// attempt to resolve an explicit version
if (!isExplicitVersion(versionSpec)) {
const localVersions = findAllVersions(toolName, arch);
const match = evaluateVersions(localVersions, versionSpec);
versionSpec = match;
}
...
対応策
semver.coerce()
でセマンティック バージョニング形式に変換してCache及びfindする
semver.coerce('5.10');