From eb8f4402d46515639663050bdfb5221d5fd43eb0 Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 21 Aug 2025 12:17:42 +0800 Subject: [PATCH] improve cache key --- dist/index.js | 62 ++++++++++++++++++++++++++++---------------- src/build-cache.ts | 11 ++++---- src/package-cache.ts | 5 ++-- src/system.ts | 28 ++++++++++++++++++++ src/unix-install.ts | 26 +------------------ src/win-install.ts | 6 ++--- 6 files changed, 80 insertions(+), 58 deletions(-) create mode 100644 src/system.ts diff --git a/dist/index.js b/dist/index.js index a89e6a5..7a8ae11 100644 --- a/dist/index.js +++ b/dist/index.js @@ -70512,9 +70512,9 @@ const core = __nccwpck_require__(7484); const exec_1 = __nccwpck_require__(5236); const io = __nccwpck_require__(4994); const cache = __nccwpck_require__(5116); -const os = __nccwpck_require__(857); const path = __nccwpck_require__(6928); const fsutils = __nccwpck_require__(7999); +const system_1 = __nccwpck_require__(7666); function getBuildTime(hours) { let key = 'BuildTime'; if (hours && hours !== '') { @@ -70545,8 +70545,7 @@ function getProjectRootPath() { } return projectRootPath; } -function getBuildCacheKey(buildCacheTime) { - var _a; +async function getBuildCacheKey(buildCacheTime) { let buildCacheKey = core.getInput('build-cache-key'); if (!buildCacheKey) { buildCacheKey = ''; @@ -70554,7 +70553,8 @@ function getBuildCacheKey(buildCacheTime) { if (!buildCacheTime || buildCacheTime === '') { buildCacheTime = getBuildTime(); } - return `xmake-build-cache-${buildCacheKey}-${buildCacheTime}-${os.arch()}-${os.platform()}-${(_a = process.env.RUNNER_OS) !== null && _a !== void 0 ? _a : 'unknown'}`; + const platformIdentifier = await (0, system_1.getPlatformIdentifier)(); + return `xmake-build-cache-${buildCacheKey}-${buildCacheTime}-${platformIdentifier}`; } async function getBuildCachePath() { let buildCachePath = core.getInput('build-cache-path'); @@ -70611,7 +70611,7 @@ async function loadBuildCache() { if (hours < 0) { break; } - const buildCacheKey = getBuildCacheKey(getBuildTime(String(hours).padStart(2, '0'))); + const buildCacheKey = await getBuildCacheKey(getBuildTime(String(hours).padStart(2, '0'))); if (!fsutils.isFile(filepath)) { core.info(`Restore build cache path: ${fullCachePath} to ${buildCachePath}, key: ${buildCacheKey}`); await cache.restoreCache([buildCacheFolder], buildCacheKey); @@ -70644,7 +70644,7 @@ async function saveBuildCache() { return; } const buildCacheFolder = getBuildCacheFolder(); - const buildCacheKey = getBuildCacheKey(); + const buildCacheKey = await getBuildCacheKey(); const buildCachePath = await getBuildCachePath(); const hitBuildCache = !!core.getState('hitBuildCache'); if (!hitBuildCache && buildCacheFolder && process.env.GITHUB_WORKSPACE && fsutils.isDir(buildCachePath)) { @@ -70832,9 +70832,9 @@ const core = __nccwpck_require__(7484); const exec_1 = __nccwpck_require__(5236); const io = __nccwpck_require__(4994); const cache = __nccwpck_require__(5116); -const os = __nccwpck_require__(857); const path = __nccwpck_require__(6928); const fsutils = __nccwpck_require__(7999); +const system_1 = __nccwpck_require__(7666); function getProjectRootPath() { let projectRootPath = core.getInput('project-path'); if (!projectRootPath) { @@ -70847,7 +70847,6 @@ function getProjectRootPath() { return projectRootPath; } async function getPackageCacheKey() { - var _a; let packageCacheKey = core.getInput('package-cache-key'); if (!packageCacheKey) { packageCacheKey = ''; @@ -70870,7 +70869,8 @@ async function getPackageCacheKey() { await (0, exec_1.exec)('xmake', ['l', 'utils.ci.packageskey'], options); packageCacheHash = packageCacheHash.trim(); } - return `xmake-package-cache-${packageCacheKey}-${packageCacheHash}-${os.arch()}-${os.platform()}-${(_a = process.env.RUNNER_OS) !== null && _a !== void 0 ? _a : 'unknown'}`; + const platformIdentifier = await (0, system_1.getPlatformIdentifier)(); + return `xmake-package-cache-${packageCacheKey}-${packageCacheHash}-${platformIdentifier}`; } async function getPackageCachePath() { let packageCachePath = ''; @@ -70976,23 +70976,16 @@ if (!exports.IsPost) { /***/ }), -/***/ 9095: +/***/ 7666: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.unixInstall = unixInstall; +exports.getPlatformIdentifier = getPlatformIdentifier; const core = __nccwpck_require__(7484); const exec_1 = __nccwpck_require__(5236); -const io = __nccwpck_require__(4994); -const toolCache = __nccwpck_require__(3472); -const cache = __nccwpck_require__(5116); const os = __nccwpck_require__(857); -const fs = __nccwpck_require__(9896); -const path = __nccwpck_require__(6928); -const semver = __nccwpck_require__(2088); -const git = __nccwpck_require__(1243); async function getPlatformIdentifier() { var _a; let identifier = `${os.platform()}-${os.arch()}-${(_a = process.env.RUNNER_OS) !== null && _a !== void 0 ? _a : 'unknown'}`; @@ -71017,6 +71010,28 @@ async function getPlatformIdentifier() { } return identifier; } + + +/***/ }), + +/***/ 9095: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.unixInstall = unixInstall; +const core = __nccwpck_require__(7484); +const exec_1 = __nccwpck_require__(5236); +const io = __nccwpck_require__(4994); +const toolCache = __nccwpck_require__(3472); +const cache = __nccwpck_require__(5116); +const os = __nccwpck_require__(857); +const fs = __nccwpck_require__(9896); +const path = __nccwpck_require__(6928); +const semver = __nccwpck_require__(2088); +const git = __nccwpck_require__(1243); +const system_1 = __nccwpck_require__(7666); async function install(sourceDir, binDir) { if (fs.existsSync(path.join(sourceDir, 'configure'))) { await (0, exec_1.exec)('sh', ['./configure'], { cwd: sourceDir }); @@ -71038,7 +71053,7 @@ async function unixInstall(version) { if (version.type !== 'local') { const ver = version.version; const sha = version.sha; - const platformIdentifier = await getPlatformIdentifier(); + const platformIdentifier = await (0, system_1.getPlatformIdentifier)(); const cacheKey = `xmake-cache-${actionsCacheKey}-${ver}-${sha}-${platformIdentifier}`; if (actionsCacheFolder && process.env.GITHUB_WORKSPACE) { const fullCachePath = path.join(process.env.GITHUB_WORKSPACE, actionsCacheFolder); @@ -71287,6 +71302,7 @@ const fs = __nccwpck_require__(9896); const path = __nccwpck_require__(6928); const semver = __nccwpck_require__(2088); const git = __nccwpck_require__(1243); +const system_1 = __nccwpck_require__(7666); function getInstallerUrl(version, latest) { let ver = version.version; switch (version.type) { @@ -71322,7 +71338,6 @@ async function installFromSource(xmakeBin, sourceDir, binDir) { await (0, exec_1.exec)(xmakeBin, ['install', '-o', binDir, 'cli'], { cwd: sourceDir }); } async function winInstall(version, latest) { - var _a; if (version.type === 'local' || latest.type === 'local') { throw new Error('Local builds for windows is not supported'); } @@ -71333,7 +71348,8 @@ async function winInstall(version, latest) { } const ver = version.version; const sha = version.sha; - const cacheKey = `xmake-cache-${actionsCacheKey}-${ver}-${sha}-${os.arch()}-${os.platform()}-${(_a = process.env.RUNNER_OS) !== null && _a !== void 0 ? _a : 'unknown'}`; + const platformIdentifier = await (0, system_1.getPlatformIdentifier)(); + const cacheKey = `xmake-cache-${actionsCacheKey}-${ver}-${sha}-${platformIdentifier}`; let toolDir = ''; if (actionsCacheFolder && process.env.GITHUB_WORKSPACE) { const fullCachePath = path.join(process.env.GITHUB_WORKSPACE, actionsCacheFolder); @@ -71341,14 +71357,14 @@ async function winInstall(version, latest) { try { fs.accessSync(path.join(fullCachePath, 'xmake.exe'), fs.constants.X_OK); } - catch (_b) { + catch (_a) { await cache.restoreCache([actionsCacheFolder], cacheKey); } fs.accessSync(path.join(fullCachePath, 'xmake.exe'), fs.constants.X_OK); toolDir = fullCachePath; core.info(`cache path: ${toolDir}, key: ${cacheKey}`); } - catch (_c) { + catch (_b) { core.warning(`No cached files found at path "${fullCachePath}".`); await io.rmRF(fullCachePath); } diff --git a/src/build-cache.ts b/src/build-cache.ts index e4cc56e..9396217 100644 --- a/src/build-cache.ts +++ b/src/build-cache.ts @@ -2,9 +2,9 @@ import * as core from '@actions/core'; import { exec, ExecOptions } from '@actions/exec'; import * as io from '@actions/io'; import * as cache from '@actions/cache'; -import * as os from 'os'; import * as path from 'path'; import * as fsutils from './fsutils'; +import { getPlatformIdentifier } from './system'; function getBuildTime(hours?: string): string { let key = 'BuildTime'; @@ -38,7 +38,7 @@ function getProjectRootPath(): string { return projectRootPath; } -function getBuildCacheKey(buildCacheTime?: string): string { +async function getBuildCacheKey(buildCacheTime?: string): Promise { let buildCacheKey = core.getInput('build-cache-key'); if (!buildCacheKey) { buildCacheKey = ''; @@ -46,7 +46,8 @@ function getBuildCacheKey(buildCacheTime?: string): string { if (!buildCacheTime || buildCacheTime === '') { buildCacheTime = getBuildTime(); } - return `xmake-build-cache-${buildCacheKey}-${buildCacheTime}-${os.arch()}-${os.platform()}-${process.env.RUNNER_OS ?? 'unknown'}`; + const platformIdentifier = await getPlatformIdentifier(); + return `xmake-build-cache-${buildCacheKey}-${buildCacheTime}-${platformIdentifier}`; } async function getBuildCachePath(): Promise { @@ -112,7 +113,7 @@ export async function loadBuildCache(): Promise { if (hours < 0) { break; } - const buildCacheKey = getBuildCacheKey(getBuildTime(String(hours).padStart(2, '0'))); + const buildCacheKey = await getBuildCacheKey(getBuildTime(String(hours).padStart(2, '0'))); if (!fsutils.isFile(filepath)) { core.info(`Restore build cache path: ${fullCachePath} to ${buildCachePath}, key: ${buildCacheKey}`); await cache.restoreCache([buildCacheFolder], buildCacheKey); @@ -147,7 +148,7 @@ export async function saveBuildCache(): Promise { } const buildCacheFolder = getBuildCacheFolder(); - const buildCacheKey = getBuildCacheKey(); + const buildCacheKey = await getBuildCacheKey(); const buildCachePath = await getBuildCachePath(); const hitBuildCache = !!core.getState('hitBuildCache'); diff --git a/src/package-cache.ts b/src/package-cache.ts index 9564f88..80c6ece 100644 --- a/src/package-cache.ts +++ b/src/package-cache.ts @@ -2,9 +2,9 @@ import * as core from '@actions/core'; import { exec, ExecOptions } from '@actions/exec'; import * as io from '@actions/io'; import * as cache from '@actions/cache'; -import * as os from 'os'; import * as path from 'path'; import * as fsutils from './fsutils'; +import { getPlatformIdentifier } from './system'; function getProjectRootPath(): string { let projectRootPath = core.getInput('project-path'); @@ -41,7 +41,8 @@ async function getPackageCacheKey(): Promise { await exec('xmake', ['l', 'utils.ci.packageskey'], options); packageCacheHash = packageCacheHash.trim(); } - return `xmake-package-cache-${packageCacheKey}-${packageCacheHash}-${os.arch()}-${os.platform()}-${process.env.RUNNER_OS ?? 'unknown'}`; + const platformIdentifier = await getPlatformIdentifier(); + return `xmake-package-cache-${packageCacheKey}-${packageCacheHash}-${platformIdentifier}`; } async function getPackageCachePath(): Promise { diff --git a/src/system.ts b/src/system.ts new file mode 100644 index 0000000..d2c8e55 --- /dev/null +++ b/src/system.ts @@ -0,0 +1,28 @@ +import * as core from '@actions/core'; +import { exec } from '@actions/exec'; +import * as os from 'os'; + +export async function getPlatformIdentifier(): Promise { + let identifier = `${os.platform()}-${os.arch()}-${process.env.RUNNER_OS ?? 'unknown'}`; + if (os.platform() === 'darwin') { + let productVersion = ''; + try { + await exec('sw_vers', ['-productVersion'], { + silent: true, + listeners: { + stdout: (data: Buffer) => { + productVersion = data.toString().trim(); + }, + }, + }); + if (productVersion) { + identifier += `-${productVersion}`; + } + } catch (error: unknown) { + core.warning( + `Failed to get macOS product version: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + return identifier; +} diff --git a/src/unix-install.ts b/src/unix-install.ts index 47a1f46..6518d84 100644 --- a/src/unix-install.ts +++ b/src/unix-install.ts @@ -9,31 +9,7 @@ import * as path from 'path'; import * as semver from 'semver'; import * as git from './git'; import { Version } from './interfaces'; - -async function getPlatformIdentifier(): Promise { - let identifier = `${os.platform()}-${os.arch()}-${process.env.RUNNER_OS ?? 'unknown'}`; - if (os.platform() === 'darwin') { - let productVersion = ''; - try { - await exec('sw_vers', ['-productVersion'], { - silent: true, - listeners: { - stdout: (data: Buffer) => { - productVersion = data.toString().trim(); - }, - }, - }); - if (productVersion) { - identifier += `-${productVersion}`; - } - } catch (error: unknown) { - core.warning( - `Failed to get macOS product version: ${error instanceof Error ? error.message : String(error)}`, - ); - } - } - return identifier; -} +import { getPlatformIdentifier } from './system'; async function install(sourceDir: string, binDir: string): Promise { if (fs.existsSync(path.join(sourceDir, 'configure'))) { diff --git a/src/win-install.ts b/src/win-install.ts index 6f9ab03..8811ec5 100644 --- a/src/win-install.ts +++ b/src/win-install.ts @@ -9,6 +9,7 @@ import * as path from 'path'; import * as semver from 'semver'; import * as git from './git'; import { Version, GitVersion } from './interfaces'; +import { getPlatformIdentifier } from './system'; function getInstallerUrl(version: GitVersion, latest: GitVersion): string { let ver = version.version; @@ -59,9 +60,8 @@ export async function winInstall(version: Version, latest: Version): Promise