mirror of
https://gitea.com/actions/cache.git
synced 2026-06-12 14:52:05 +08:00
PR feedback
This commit is contained in:
@@ -18,7 +18,7 @@ See ["Caching dependencies to speed up workflows"](https://docs.github.com/en/ac
|
|||||||
### ⚠️ Important changes
|
### ⚠️ Important changes
|
||||||
|
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> `actions/cache@v6` runs on the Node.js 24 runtime and requires a minimum Actions Runner version of `2.327.1`.
|
> `actions/cache@v5` runs on the Node.js 24 runtime and requires a minimum Actions Runner version of `2.327.1`.
|
||||||
> If you are using self-hosted runners, ensure they are updated before upgrading.
|
> If you are using self-hosted runners, ensure they are updated before upgrading.
|
||||||
|
|
||||||
The cache backend service has been rewritten from the ground up for improved performance and reliability. [actions/cache](https://github.com/actions/cache) now integrates with the new cache service (v2) APIs.
|
The cache backend service has been rewritten from the ground up for improved performance and reliability. [actions/cache](https://github.com/actions/cache) now integrates with the new cache service (v2) APIs.
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ let pristineEnv: NodeJS.ProcessEnv;
|
|||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
pristineEnv = { ...process.env };
|
pristineEnv = { ...process.env };
|
||||||
jest.clearAllMocks();
|
jest.clearAllMocks();
|
||||||
(core.getInput as jest.Mock).mockImplementation(
|
jest.mocked(core.getInput).mockImplementation(
|
||||||
(name: string, options?: { required?: boolean }) => {
|
(name: string, options?: { required?: boolean }) => {
|
||||||
const val =
|
const val =
|
||||||
process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] ||
|
process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] ||
|
||||||
@@ -217,12 +217,12 @@ test("getInputAsBool throws if required and value missing", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test("isCacheFeatureAvailable for ac enabled", () => {
|
test("isCacheFeatureAvailable for ac enabled", () => {
|
||||||
(cache.isFeatureAvailable as jest.Mock).mockReturnValue(true);
|
jest.mocked(cache.isFeatureAvailable).mockReturnValue(true);
|
||||||
expect(actionUtils.isCacheFeatureAvailable()).toBe(true);
|
expect(actionUtils.isCacheFeatureAvailable()).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("isCacheFeatureAvailable for ac disabled on GHES", () => {
|
test("isCacheFeatureAvailable for ac disabled on GHES", () => {
|
||||||
(cache.isFeatureAvailable as jest.Mock).mockReturnValue(false);
|
jest.mocked(cache.isFeatureAvailable).mockReturnValue(false);
|
||||||
|
|
||||||
const message = `Cache action is only supported on GHES version >= 3.5. If you are on version >=3.5 Please check with GHES admin if Actions cache service is enabled or not.
|
const message = `Cache action is only supported on GHES version >= 3.5. If you are on version >=3.5 Please check with GHES admin if Actions cache service is enabled or not.
|
||||||
Otherwise please upgrade to GHES version >= 3.5 and If you are also using Github Connect, please unretire the actions/cache namespace before upgrade (see https://docs.github.com/en/enterprise-server@3.5/admin/github-actions/managing-access-to-actions-from-githubcom/enabling-automatic-access-to-githubcom-actions-using-github-connect#automatic-retirement-of-namespaces-for-actions-accessed-on-githubcom)`;
|
Otherwise please upgrade to GHES version >= 3.5 and If you are also using Github Connect, please unretire the actions/cache namespace before upgrade (see https://docs.github.com/en/enterprise-server@3.5/admin/github-actions/managing-access-to-actions-from-githubcom/enabling-automatic-access-to-githubcom-actions-using-github-connect#automatic-retirement-of-namespaces-for-actions-accessed-on-githubcom)`;
|
||||||
@@ -237,7 +237,7 @@ Otherwise please upgrade to GHES version >= 3.5 and If you are also using Github
|
|||||||
});
|
});
|
||||||
|
|
||||||
test("isCacheFeatureAvailable for ac disabled on dotcom", () => {
|
test("isCacheFeatureAvailable for ac disabled on dotcom", () => {
|
||||||
(cache.isFeatureAvailable as jest.Mock).mockReturnValue(false);
|
jest.mocked(cache.isFeatureAvailable).mockReturnValue(false);
|
||||||
|
|
||||||
const message =
|
const message =
|
||||||
"An internal error has occurred in cache backend. Please check https://www.githubstatus.com/ for any ongoing issue in actions.";
|
"An internal error has occurred in cache backend. Please check https://www.githubstatus.com/ for any ongoing issue in actions.";
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ const testUtils = await import("../src/utils/testUtils");
|
|||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
jest.clearAllMocks();
|
jest.clearAllMocks();
|
||||||
(core.getInput as jest.Mock).mockImplementation(
|
jest.mocked(core.getInput).mockImplementation(
|
||||||
(name: string, options?: { required?: boolean }) => {
|
(name: string, options?: { required?: boolean }) => {
|
||||||
const val =
|
const val =
|
||||||
process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] ||
|
process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] ||
|
||||||
@@ -59,8 +59,8 @@ beforeEach(() => {
|
|||||||
return val.trim();
|
return val.trim();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
(core.getState as jest.Mock).mockReturnValue("");
|
jest.mocked(core.getState).mockReturnValue("");
|
||||||
(cache.isFeatureAvailable as jest.Mock).mockReturnValue(true);
|
jest.mocked(cache.isFeatureAvailable).mockReturnValue(true);
|
||||||
process.env[Events.Key] = Events.Push;
|
process.env[Events.Key] = Events.Push;
|
||||||
process.env[RefKey] = "refs/heads/feature-branch";
|
process.env[RefKey] = "refs/heads/feature-branch";
|
||||||
});
|
});
|
||||||
@@ -83,7 +83,7 @@ test("restore with invalid event outputs warning", async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test("restore without AC available should no-op", async () => {
|
test("restore without AC available should no-op", async () => {
|
||||||
(cache.isFeatureAvailable as jest.Mock).mockReturnValue(false);
|
jest.mocked(cache.isFeatureAvailable).mockReturnValue(false);
|
||||||
|
|
||||||
await restoreImpl(new StateProvider());
|
await restoreImpl(new StateProvider());
|
||||||
|
|
||||||
@@ -93,13 +93,21 @@ test("restore without AC available should no-op", async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test("restore on GHES without AC available should no-op", async () => {
|
test("restore on GHES without AC available should no-op", async () => {
|
||||||
(cache.isFeatureAvailable as jest.Mock).mockReturnValue(false);
|
process.env["GITHUB_SERVER_URL"] = "https://my-ghes-server.com";
|
||||||
|
jest.mocked(cache.isFeatureAvailable).mockReturnValue(false);
|
||||||
|
|
||||||
await restoreImpl(new StateProvider());
|
await restoreImpl(new StateProvider());
|
||||||
|
|
||||||
expect(cache.restoreCache).toHaveBeenCalledTimes(0);
|
expect(cache.restoreCache).toHaveBeenCalledTimes(0);
|
||||||
expect(core.setOutput).toHaveBeenCalledTimes(1);
|
expect(core.setOutput).toHaveBeenCalledTimes(1);
|
||||||
expect(core.setOutput).toHaveBeenCalledWith("cache-hit", "false");
|
expect(core.setOutput).toHaveBeenCalledWith("cache-hit", "false");
|
||||||
|
expect(core.info).toHaveBeenCalledWith(
|
||||||
|
expect.stringContaining(
|
||||||
|
"Cache action is only supported on GHES version >= 3.5"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
delete process.env["GITHUB_SERVER_URL"];
|
||||||
});
|
});
|
||||||
|
|
||||||
test("restore on GHES with AC available ", async () => {
|
test("restore on GHES with AC available ", async () => {
|
||||||
@@ -111,7 +119,7 @@ test("restore on GHES with AC available ", async () => {
|
|||||||
enableCrossOsArchive: false
|
enableCrossOsArchive: false
|
||||||
});
|
});
|
||||||
|
|
||||||
(cache.restoreCache as jest.Mock).mockResolvedValue(key);
|
jest.mocked(cache.restoreCache).mockResolvedValue(key);
|
||||||
|
|
||||||
await restoreImpl(new StateProvider());
|
await restoreImpl(new StateProvider());
|
||||||
|
|
||||||
@@ -160,7 +168,7 @@ test("restore with too many keys should fail", async () => {
|
|||||||
restoreKeys,
|
restoreKeys,
|
||||||
enableCrossOsArchive: false
|
enableCrossOsArchive: false
|
||||||
});
|
});
|
||||||
(cache.restoreCache as jest.Mock).mockRejectedValue(
|
jest.mocked(cache.restoreCache).mockRejectedValue(
|
||||||
new Error("Key Validation Error: Keys are limited to a maximum of 10.")
|
new Error("Key Validation Error: Keys are limited to a maximum of 10.")
|
||||||
);
|
);
|
||||||
await restoreImpl(new StateProvider());
|
await restoreImpl(new StateProvider());
|
||||||
@@ -178,7 +186,7 @@ test("restore with large key should fail", async () => {
|
|||||||
key,
|
key,
|
||||||
enableCrossOsArchive: false
|
enableCrossOsArchive: false
|
||||||
});
|
});
|
||||||
(cache.restoreCache as jest.Mock).mockRejectedValue(
|
jest.mocked(cache.restoreCache).mockRejectedValue(
|
||||||
new Error(
|
new Error(
|
||||||
`Key Validation Error: ${key} cannot be larger than 512 characters.`
|
`Key Validation Error: ${key} cannot be larger than 512 characters.`
|
||||||
)
|
)
|
||||||
@@ -198,7 +206,7 @@ test("restore with invalid key should fail", async () => {
|
|||||||
key,
|
key,
|
||||||
enableCrossOsArchive: false
|
enableCrossOsArchive: false
|
||||||
});
|
});
|
||||||
(cache.restoreCache as jest.Mock).mockRejectedValue(
|
jest.mocked(cache.restoreCache).mockRejectedValue(
|
||||||
new Error(`Key Validation Error: ${key} cannot contain commas.`)
|
new Error(`Key Validation Error: ${key} cannot contain commas.`)
|
||||||
);
|
);
|
||||||
await restoreImpl(new StateProvider());
|
await restoreImpl(new StateProvider());
|
||||||
@@ -217,7 +225,7 @@ test("restore with no cache found", async () => {
|
|||||||
enableCrossOsArchive: false
|
enableCrossOsArchive: false
|
||||||
});
|
});
|
||||||
|
|
||||||
(cache.restoreCache as jest.Mock).mockResolvedValue(undefined);
|
jest.mocked(cache.restoreCache).mockResolvedValue(undefined);
|
||||||
|
|
||||||
await restoreImpl(new StateProvider());
|
await restoreImpl(new StateProvider());
|
||||||
|
|
||||||
@@ -240,7 +248,7 @@ test("restore with restore keys and no cache found", async () => {
|
|||||||
enableCrossOsArchive: false
|
enableCrossOsArchive: false
|
||||||
});
|
});
|
||||||
|
|
||||||
(cache.restoreCache as jest.Mock).mockResolvedValue(undefined);
|
jest.mocked(cache.restoreCache).mockResolvedValue(undefined);
|
||||||
|
|
||||||
await restoreImpl(new StateProvider());
|
await restoreImpl(new StateProvider());
|
||||||
|
|
||||||
@@ -261,7 +269,7 @@ test("restore with cache found for key", async () => {
|
|||||||
enableCrossOsArchive: false
|
enableCrossOsArchive: false
|
||||||
});
|
});
|
||||||
|
|
||||||
(cache.restoreCache as jest.Mock).mockResolvedValue(key);
|
jest.mocked(cache.restoreCache).mockResolvedValue(key);
|
||||||
|
|
||||||
await restoreImpl(new StateProvider());
|
await restoreImpl(new StateProvider());
|
||||||
|
|
||||||
@@ -284,7 +292,7 @@ test("restore with cache found for restore key", async () => {
|
|||||||
enableCrossOsArchive: false
|
enableCrossOsArchive: false
|
||||||
});
|
});
|
||||||
|
|
||||||
(cache.restoreCache as jest.Mock).mockResolvedValue(restoreKey);
|
jest.mocked(cache.restoreCache).mockResolvedValue(restoreKey);
|
||||||
|
|
||||||
await restoreImpl(new StateProvider());
|
await restoreImpl(new StateProvider());
|
||||||
|
|
||||||
@@ -307,7 +315,7 @@ test("restore with lookup-only set", async () => {
|
|||||||
lookupOnly: true
|
lookupOnly: true
|
||||||
});
|
});
|
||||||
|
|
||||||
(cache.restoreCache as jest.Mock).mockResolvedValue(key);
|
jest.mocked(cache.restoreCache).mockResolvedValue(key);
|
||||||
|
|
||||||
await restoreImpl(new StateProvider());
|
await restoreImpl(new StateProvider());
|
||||||
|
|
||||||
|
|||||||
@@ -101,11 +101,19 @@ test("save without AC available should no-op", async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test("save on ghes without AC available should no-op", async () => {
|
test("save on ghes without AC available should no-op", async () => {
|
||||||
|
process.env["GITHUB_SERVER_URL"] = "https://my-ghes-server.com";
|
||||||
(cache.isFeatureAvailable as jest.Mock).mockReturnValue(false);
|
(cache.isFeatureAvailable as jest.Mock).mockReturnValue(false);
|
||||||
|
|
||||||
await saveImpl(new StateProvider());
|
await saveImpl(new StateProvider());
|
||||||
|
|
||||||
expect(cache.saveCache).toHaveBeenCalledTimes(0);
|
expect(cache.saveCache).toHaveBeenCalledTimes(0);
|
||||||
|
expect(core.info).toHaveBeenCalledWith(
|
||||||
|
expect.stringContaining(
|
||||||
|
"Cache action is only supported on GHES version >= 3.5"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
delete process.env["GITHUB_SERVER_URL"];
|
||||||
});
|
});
|
||||||
|
|
||||||
test("save on GHES with AC available", async () => {
|
test("save on GHES with AC available", async () => {
|
||||||
@@ -159,8 +167,8 @@ test("save with missing input outputs warning", async () => {
|
|||||||
const savedCacheKey = "Linux-node-";
|
const savedCacheKey = "Linux-node-";
|
||||||
|
|
||||||
(core.getState as jest.Mock)
|
(core.getState as jest.Mock)
|
||||||
.mockReturnValueOnce(savedCacheKey)
|
.mockReturnValueOnce(primaryKey)
|
||||||
.mockReturnValueOnce(primaryKey);
|
.mockReturnValueOnce(savedCacheKey);
|
||||||
|
|
||||||
await saveImpl(new StateProvider());
|
await saveImpl(new StateProvider());
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"main": "dist/restore/index.js",
|
"main": "dist/restore/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc && ncc build -o dist/restore src/restore.ts && ncc build -o dist/save src/save.ts && ncc build -o dist/restore-only src/restoreOnly.ts && ncc build -o dist/save-only src/saveOnly.ts",
|
"build": "tsc && ncc build -o dist/restore src/restore.ts && ncc build -o dist/save src/save.ts && ncc build -o dist/restore-only src/restoreOnly.ts && ncc build -o dist/save-only src/saveOnly.ts",
|
||||||
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage",
|
"test": "tsc --noEmit && node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage",
|
||||||
"lint": "eslint **/*.ts --cache",
|
"lint": "eslint **/*.ts --cache",
|
||||||
"format": "prettier --write **/*.ts",
|
"format": "prettier --write **/*.ts",
|
||||||
"format-check": "prettier --check **/*.ts"
|
"format-check": "prettier --check **/*.ts"
|
||||||
|
|||||||
Reference in New Issue
Block a user