mirror of
https://github.com/actions/cache.git
synced 2026-01-14 17:43:06 +08:00
Compare commits
3 Commits
7755eb5907
...
351dc22c0c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
351dc22c0c | ||
|
|
06cf66871d | ||
|
|
c7dc3e4869 |
@ -1,5 +1,6 @@
|
||||
import * as cache from "@actions/cache";
|
||||
import * as core from "@actions/core";
|
||||
import { RequestError } from "@octokit/request-error";
|
||||
import nock from "nock";
|
||||
|
||||
import { Events, RefKey } from "../src/constants";
|
||||
@ -207,7 +208,7 @@ test("getInputAsBool throws if required and value missing", () => {
|
||||
).toThrowError();
|
||||
});
|
||||
|
||||
test("deleteCacheByKey produces 'HttpError: 404' when cache is not found.", async () => {
|
||||
test("deleteCacheByKey returns 'HttpError: 404' when cache is not found.", async () => {
|
||||
const event = Events.Push;
|
||||
|
||||
process.env["GITHUB_REPOSITORY"] = "owner/repo";
|
||||
@ -225,73 +226,14 @@ test("deleteCacheByKey produces 'HttpError: 404' when cache is not found.", asyn
|
||||
expect(logWarningMock).toHaveBeenCalledWith(
|
||||
expect.stringMatching(/404: Not Found/i)
|
||||
);
|
||||
expect(response).toBe(undefined);
|
||||
expect(response).toBeInstanceOf(RequestError);
|
||||
expect(response).toMatchObject({
|
||||
name: "HttpError",
|
||||
status: 404
|
||||
});
|
||||
});
|
||||
|
||||
test("deleteCacheByKey does not delete anything if it finds more than one entry for the given key.", async () => {
|
||||
const event = Events.Push;
|
||||
|
||||
process.env["GITHUB_REPOSITORY"] = "owner/repo";
|
||||
process.env["GITHUB_TOKEN"] =
|
||||
"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";
|
||||
process.env["GITHUB_ACTION"] = "__owner___run-repo";
|
||||
process.env[Events.Key] = event;
|
||||
process.env[RefKey] = "";
|
||||
const logWarningMock = jest.spyOn(actionUtils, "logWarning");
|
||||
const response = await actionUtils.deleteCacheByKey(
|
||||
testUtils.failureCacheKey,
|
||||
"owner",
|
||||
"repo"
|
||||
);
|
||||
expect(logWarningMock).toHaveBeenCalledWith(
|
||||
`More than one cache entry found for key ${testUtils.failureCacheKey}`
|
||||
);
|
||||
expect(response).toBe(undefined);
|
||||
});
|
||||
|
||||
test("deleteCacheByKey does not delete anything if the key matches a cache belonging to another ref.", async () => {
|
||||
const event = Events.Push;
|
||||
|
||||
process.env["GITHUB_REPOSITORY"] = "owner/repo";
|
||||
process.env["GITHUB_TOKEN"] =
|
||||
"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";
|
||||
process.env["GITHUB_ACTION"] = "__owner___run-repo";
|
||||
process.env[Events.Key] = event;
|
||||
process.env[RefKey] = "ref/heads/feature";
|
||||
const logWarningMock = jest.spyOn(actionUtils, "logWarning");
|
||||
const response = await actionUtils.deleteCacheByKey(
|
||||
testUtils.wrongRefCacheKey,
|
||||
"owner",
|
||||
"repo"
|
||||
);
|
||||
expect(logWarningMock).toHaveBeenCalledWith(
|
||||
`No cache entries for key ${testUtils.wrongRefCacheKey} belong to gitref ${process.env[RefKey]}.`
|
||||
);
|
||||
expect(response).toBe(undefined);
|
||||
});
|
||||
|
||||
test("deleteCacheByKey produces 'HttpError: 404' when cache is not found.", async () => {
|
||||
const event = Events.Push;
|
||||
|
||||
process.env["GITHUB_REPOSITORY"] = "owner/repo";
|
||||
process.env["GITHUB_TOKEN"] =
|
||||
"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";
|
||||
process.env["GITHUB_ACTION"] = "__owner___run-repo";
|
||||
process.env[Events.Key] = event;
|
||||
process.env[RefKey] = "ref/heads/feature";
|
||||
const logWarningMock = jest.spyOn(actionUtils, "logWarning");
|
||||
const response = await actionUtils.deleteCacheByKey(
|
||||
testUtils.failureCacheKey,
|
||||
"owner",
|
||||
"repo"
|
||||
);
|
||||
expect(logWarningMock).toHaveBeenCalledWith(
|
||||
expect.stringMatching(/404: Not Found/i)
|
||||
);
|
||||
expect(response).toBe(undefined);
|
||||
});
|
||||
|
||||
test("deleteCacheByKey produces 'HttpError: 401' on an invalid non-mocked request.", async () => {
|
||||
test("deleteCacheByKey returns 'HttpError: 401' on an invalid non-mocked request.", async () => {
|
||||
const event = Events.Push;
|
||||
|
||||
process.env["GITHUB_REPOSITORY"] = "owner/repo";
|
||||
@ -310,11 +252,15 @@ test("deleteCacheByKey produces 'HttpError: 401' on an invalid non-mocked reques
|
||||
expect(logWarningMock).toHaveBeenCalledWith(
|
||||
expect.stringMatching(/401: Bad Credentials/i)
|
||||
);
|
||||
expect(response).toBe(undefined);
|
||||
expect(response).toBeInstanceOf(RequestError);
|
||||
expect(response).toMatchObject({
|
||||
name: "HttpError",
|
||||
status: 401
|
||||
});
|
||||
nock.disableNetConnect();
|
||||
});
|
||||
|
||||
test("deleteCacheByKey returns 204 / No Content when successful.", async () => {
|
||||
test("deleteCacheByKey returns matched cache data when successful.", async () => {
|
||||
const event = Events.Push;
|
||||
|
||||
process.env["GITHUB_REPOSITORY"] = "owner/repo";
|
||||
@ -324,13 +270,29 @@ test("deleteCacheByKey returns 204 / No Content when successful.", async () => {
|
||||
process.env[Events.Key] = event;
|
||||
process.env[RefKey] = "ref/heads/feature";
|
||||
|
||||
const expectedResponse = {
|
||||
id: expect.any(Number),
|
||||
ref: expect.any(String),
|
||||
key: expect.any(String),
|
||||
version: expect.any(String),
|
||||
last_accessed_at: expect.any(String),
|
||||
created_at: expect.any(String),
|
||||
size_in_bytes: expect.any(Number)
|
||||
};
|
||||
const logWarningMock = jest.spyOn(actionUtils, "logWarning");
|
||||
const response = await actionUtils.deleteCacheByKey(
|
||||
testUtils.successCacheKey,
|
||||
"owner",
|
||||
"repo"
|
||||
);
|
||||
expect(response).toBe(204);
|
||||
expect(response).toMatchObject({
|
||||
data: expect.objectContaining({
|
||||
total_count: expect.any(Number),
|
||||
actions_caches: expect.arrayContaining([
|
||||
expect.objectContaining(expectedResponse)
|
||||
])
|
||||
})
|
||||
});
|
||||
expect(logWarningMock).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
|
||||
|
||||
@ -492,11 +492,7 @@ test("save with cache hit and refresh-cache will try to delete and re-create ent
|
||||
);
|
||||
expect(infoMock).toHaveBeenNthCalledWith(
|
||||
2,
|
||||
expect.stringMatching(
|
||||
new RegExp(
|
||||
`Succesfully deleted cache with key: ${primaryKey}, id: \\d+`
|
||||
)
|
||||
)
|
||||
`Succesfully deleted cache with key: ${primaryKey}`
|
||||
);
|
||||
expect(infoMock).toHaveBeenNthCalledWith(
|
||||
3,
|
||||
@ -569,11 +565,7 @@ test("Granular save will use lookup to determine if cache needs to be updated or
|
||||
);
|
||||
expect(infoMock).toHaveBeenNthCalledWith(
|
||||
2,
|
||||
expect.stringMatching(
|
||||
new RegExp(
|
||||
`Succesfully deleted cache with key: ${primaryKey}, id: \\d+`
|
||||
)
|
||||
)
|
||||
`Succesfully deleted cache with key: ${primaryKey}`
|
||||
);
|
||||
expect(infoMock).toHaveBeenNthCalledWith(
|
||||
3,
|
||||
|
||||
130411
dist/restore-only/index.js
vendored
130411
dist/restore-only/index.js
vendored
File diff suppressed because one or more lines are too long
130489
dist/restore/index.js
vendored
130489
dist/restore/index.js
vendored
File diff suppressed because one or more lines are too long
130218
dist/save-only/index.js
vendored
130218
dist/save-only/index.js
vendored
File diff suppressed because one or more lines are too long
130320
dist/save/index.js
vendored
130320
dist/save/index.js
vendored
File diff suppressed because one or more lines are too long
6861
package-lock.json
generated
6861
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
11
package.json
11
package.json
@ -32,10 +32,10 @@
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.5.2",
|
||||
"@types/nock": "^11.1.0",
|
||||
"@types/node": "^20.14.8",
|
||||
"@types/node": "^16.18.3",
|
||||
"@typescript-eslint/eslint-plugin": "^5.45.0",
|
||||
"@typescript-eslint/parser": "^5.45.0",
|
||||
"@vercel/ncc": "^0.38.3",
|
||||
"@zeit/ncc": "^0.20.5",
|
||||
"eslint": "^8.28.0",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
@ -44,10 +44,13 @@
|
||||
"eslint-plugin-simple-import-sort": "^7.0.0",
|
||||
"jest": "^28.1.3",
|
||||
"jest-circus": "^27.5.1",
|
||||
"msw": "^1.3.5",
|
||||
"msw": "^0.49.3",
|
||||
"nock": "^13.2.9",
|
||||
"prettier": "^2.8.0",
|
||||
"ts-jest": "^28.0.8",
|
||||
"typescript": "^4.9.5"
|
||||
"typescript": "^4.9.3"
|
||||
},
|
||||
"overrides": {
|
||||
"@mswjs/interceptors": "^0.17.7"
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,7 +63,6 @@ async function saveImpl(stateProvider: IStateProvider): Promise<number | void> {
|
||||
);
|
||||
}
|
||||
if (utils.isExactKeyMatch(primaryKey, restoredKey)) {
|
||||
/* istanbul ignore next */
|
||||
const { GITHUB_TOKEN, GITHUB_REPOSITORY } = process.env || null;
|
||||
if (GITHUB_TOKEN && GITHUB_REPOSITORY && refreshCache === true) {
|
||||
core.info(
|
||||
|
||||
@ -22,61 +22,32 @@ export function isExactKeyMatch(key: string, cacheKey?: string): boolean {
|
||||
);
|
||||
}
|
||||
|
||||
export function logWarning(message: string): void {
|
||||
const warningPrefix = "[warning]";
|
||||
core.info(`${warningPrefix}${message}`);
|
||||
}
|
||||
|
||||
export async function deleteCacheByKey(key: string, owner: string, repo: string) : Promise <number | void> {
|
||||
export async function deleteCacheByKey(key: string, owner: string, repo: string) {
|
||||
const octokit = new Octokit();
|
||||
let response;
|
||||
try {
|
||||
const gitRef = process.env[RefKey];
|
||||
let cacheEntry = await octokit.rest.actions.getActionsCacheList({
|
||||
response = await octokit.rest.actions.deleteActionsCacheByKey({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
key: key,
|
||||
ref: gitRef
|
||||
key: key
|
||||
});
|
||||
const { data: {
|
||||
total_count,
|
||||
actions_caches
|
||||
}
|
||||
} = cacheEntry;
|
||||
if (total_count !== 1 || total_count !== actions_caches.length) { // leave all find logic to the actual cache implementation. We just want to make sure we're returned a single element so we don't accidentally delete an entry that belongs to a different gitref.
|
||||
if (total_count > 1) {
|
||||
exports.logWarning(`More than one cache entry found for key ${key}`);
|
||||
}
|
||||
else if (total_count === 0 || actions_caches.length === 0) {
|
||||
exports.logWarning(`No cache entries for key ${key} belong to gitref ${gitRef}.`);
|
||||
}
|
||||
// This situation is likely never actually going to come up.
|
||||
// Istanbul is being dumb and I can't ignore this path.
|
||||
else if (total_count !== actions_caches.length) {
|
||||
exports.logWarning(`Reported cache entry matches for ${key} does not match length of 'actions_caches' array in API response.`);
|
||||
}
|
||||
core.info(`Skip trying to delete cache entry for key ${key}.`)
|
||||
return;
|
||||
}
|
||||
let id = actions_caches[0].id;
|
||||
response = await octokit.rest.actions.deleteActionsCacheById({
|
||||
owner: owner,
|
||||
repo: repo,
|
||||
cache_id: id
|
||||
});
|
||||
if (response.status === 204) {
|
||||
core.info(`Succesfully deleted cache with key: ${key}, id: ${id}`);
|
||||
return 204;
|
||||
if (response.status === 200) {
|
||||
core.info(`Succesfully deleted cache with key: ${response.data.actions_caches[0].key}`);
|
||||
}
|
||||
} catch (e) {
|
||||
if (e instanceof RequestError) {
|
||||
let err = e as RequestError;
|
||||
let errData = err.response?.data as any | undefined;
|
||||
exports.logWarning(`Github API reported error: ${err.name} '${err.status}: ${errData?.message}'`);
|
||||
exports.logWarning(`${err.name} '${err.status}: ${errData?.message}' trying to delete cache with key: ${key}`);
|
||||
}
|
||||
core.info(`Couldn't delete cache entry for key ${key}.`)
|
||||
return;
|
||||
response = e;
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
export function logWarning(message: string): void {
|
||||
const warningPrefix = "[warning]";
|
||||
core.info(`${warningPrefix}${message}`);
|
||||
}
|
||||
|
||||
// Cache token authorized for all events that are tied to a ref
|
||||
|
||||
@ -1,16 +1,12 @@
|
||||
/* istanbul ignore file */
|
||||
|
||||
import { Inputs } from "../constants";
|
||||
import { rest } from "msw";
|
||||
import { setupServer } from "msw/node";
|
||||
import nock from "nock";
|
||||
|
||||
export const successCacheKey = "Linux-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
||||
export const wrongRefCacheKey = "Linux-latest-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
||||
export const failureCacheKey = "Windows-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
||||
export const passThroughCacheKey = "macOS-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
||||
const successCacheId = 1337;
|
||||
const failureCacheId = 69;
|
||||
|
||||
|
||||
// See: https://github.com/actions/toolkit/blob/master/packages/core/src/core.ts#L67
|
||||
function getInputName(name: string): string {
|
||||
@ -60,80 +56,31 @@ export function clearInputs(): void {
|
||||
delete process.env[getInputName(Inputs.RefreshCache)];
|
||||
}
|
||||
|
||||
export const mockServer = setupServer(
|
||||
rest.delete('https://api.github.com/repos/owner/repo/actions/caches/', (req, res, ctx) => {
|
||||
return res(ctx.status(422),
|
||||
/* istanbul ignore next */
|
||||
export const mockServer = setupServer(rest.delete('https://api.github.com/repos/owner/repo/actions/caches', (req, res, ctx) => {
|
||||
if (req.url?.searchParams?.get('key') === failureCacheKey) {
|
||||
return res(ctx.status(404),
|
||||
ctx.json({
|
||||
message: "Invalid request.\n\nMissing required query parameter key",
|
||||
documentation_url: "https://docs.github.com/rest/actions/cache#delete-github-actions-caches-for-a-repository-using-a-cache-key",
|
||||
})
|
||||
)
|
||||
}),
|
||||
rest.delete('https://api.github.com/repos/owner/repo/actions/caches/:id', (req, res, ctx) => {
|
||||
const { id } = req.params;
|
||||
if (parseInt(id as string) === failureCacheId) {
|
||||
return res(ctx.status(404),
|
||||
ctx.json({
|
||||
message: "Not Found",
|
||||
documentation_url: "https://docs.github.com/rest/actions/cache#delete-a-github-actions-cache-for-a-repository-using-a-cache-id"
|
||||
}));
|
||||
}
|
||||
return res(ctx.status(204));
|
||||
}),
|
||||
// This endpoint always returns 200/OK, what we're checking here is whether we can get a unique cache ID, to avoid deleting the wrong entry.
|
||||
rest.get('https://api.github.com/repos/owner/repo/actions/caches', (req, res, ctx) => {
|
||||
let key : string = req.url?.searchParams?.get('key') || '';
|
||||
let ref : string = req.url?.searchParams?.get('ref') || '';
|
||||
if (key === '' || ref === '') {
|
||||
return res(ctx.status(200),
|
||||
ctx.json({
|
||||
total_count: 2,
|
||||
actions_caches: [{
|
||||
id: 15,
|
||||
ref: "refs/heads/main",
|
||||
key: failureCacheKey,
|
||||
version: "73885106f58cc52a7df9ec4d4a5622a5614813162cb516c759a30af6bf56e6f0",
|
||||
last_accessed_at: "2022-12-29T22:06:42.683333300Z",
|
||||
created_at: "2022-12-29T22:06:42.683333300Z",
|
||||
size_in_bytes: 6057793
|
||||
},
|
||||
{
|
||||
id: 16,
|
||||
ref: "refs/heads/another-feature-branch",
|
||||
key: failureCacheKey,
|
||||
version: "73885106f58cc52a7df9ec4d4a5622a5614813162cb516c759a30af6bf56e6f0",
|
||||
last_accessed_at: "2022-12-29T22:06:42.683333300Z",
|
||||
created_at: "2022-12-29T22:06:42.683333300Z",
|
||||
size_in_bytes: 6057793
|
||||
}]
|
||||
})
|
||||
);
|
||||
}
|
||||
// This is the behavior seen when search doesn't find anything, but it is seen both when no key matches, as well as when the key matches but the entry belongs to another (likely the base) branch.
|
||||
else if (key === wrongRefCacheKey) {
|
||||
return res(ctx.status(200),
|
||||
ctx.json({
|
||||
total_count: 0,
|
||||
actions_caches: []
|
||||
})
|
||||
);
|
||||
}
|
||||
else if (key === successCacheKey || key === failureCacheKey) {
|
||||
return res(ctx.status(200),
|
||||
ctx.json({
|
||||
total_count: 1,
|
||||
actions_caches: [{
|
||||
id: (key === successCacheKey ? successCacheId : failureCacheId),
|
||||
ref: ref,
|
||||
key: key,
|
||||
version: "93a0f912fdb70083e929c1bf564bca2050be1c4e0932f7f9e78465ddcfbcc8f6",
|
||||
last_accessed_at: "2022-12-29T22:06:42.683333300Z",
|
||||
created_at: "2022-12-29T22:06:42.683333300Z",
|
||||
size_in_bytes: 6057793
|
||||
}]
|
||||
})
|
||||
);
|
||||
}
|
||||
message: "Not Found",
|
||||
documentation_url: "https://docs.github.com/rest/actions/cache#delete-github-actions-caches-for-a-repository-using-a-cache-key"
|
||||
}));
|
||||
}
|
||||
else if (req.url?.searchParams?.get('key') === successCacheKey) {
|
||||
return res(ctx.status(200),
|
||||
ctx.json({
|
||||
total_count: 1,
|
||||
actions_caches: [{
|
||||
id: 15,
|
||||
ref: "refs/heads/main",
|
||||
key: successCacheKey,
|
||||
version: "93a0f912fdb70083e929c1bf564bca2050be1c4e0932f7f9e78465ddcfbcc8f6",
|
||||
last_accessed_at: "2022-12-29T22:06:42.683333300Z",
|
||||
created_at: "2022-12-29T22:06:42.683333300Z",
|
||||
size_in_bytes: 6057793
|
||||
}]
|
||||
}));
|
||||
}
|
||||
else if (req.url?.searchParams?.get('key') === passThroughCacheKey) {
|
||||
return req.passthrough();
|
||||
})
|
||||
);
|
||||
}
|
||||
}));
|
||||
90
src/utils/testUtils.ts.orig
Normal file
90
src/utils/testUtils.ts.orig
Normal file
@ -0,0 +1,90 @@
|
||||
import { Inputs } from "../constants";
|
||||
import { rest } from "msw";
|
||||
import { setupServer } from "msw/node";
|
||||
import nock from "nock";
|
||||
|
||||
export const successCacheKey = "Linux-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
||||
export const failureCacheKey = "Windows-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
||||
export const passThroughCacheKey = "macOS-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
||||
|
||||
|
||||
// See: https://github.com/actions/toolkit/blob/master/packages/core/src/core.ts#L67
|
||||
function getInputName(name: string): string {
|
||||
return `INPUT_${name.replace(/ /g, "_").toUpperCase()}`;
|
||||
}
|
||||
|
||||
export function setInput(name: string, value: string): void {
|
||||
process.env[getInputName(name)] = value;
|
||||
}
|
||||
|
||||
interface CacheInput {
|
||||
path: string;
|
||||
key: string;
|
||||
restoreKeys?: string[];
|
||||
enableCrossOsArchive?: boolean;
|
||||
failOnCacheMiss?: boolean;
|
||||
lookupOnly?: boolean;
|
||||
refreshCache?: boolean;
|
||||
}
|
||||
|
||||
export function setInputs(input: CacheInput): void {
|
||||
setInput(Inputs.Path, input.path);
|
||||
setInput(Inputs.Key, input.key);
|
||||
input.restoreKeys &&
|
||||
setInput(Inputs.RestoreKeys, input.restoreKeys.join("\n"));
|
||||
input.enableCrossOsArchive !== undefined &&
|
||||
setInput(
|
||||
Inputs.EnableCrossOsArchive,
|
||||
input.enableCrossOsArchive.toString()
|
||||
);
|
||||
input.failOnCacheMiss !== undefined &&
|
||||
setInput(Inputs.FailOnCacheMiss, input.failOnCacheMiss.toString());
|
||||
input.lookupOnly !== undefined &&
|
||||
setInput(Inputs.LookupOnly, input.lookupOnly.toString());
|
||||
<<<<<<< HEAD
|
||||
input.refreshCache !== undefined &&
|
||||
setInput(Inputs.RefreshCache, input.refreshCache.toString());
|
||||
=======
|
||||
input.refreshCache && setInput(Inputs.RefreshCache, input.refreshCache.toString());
|
||||
>>>>>>> 0111818 (Allow refreshing cache also with granular save.)
|
||||
}
|
||||
|
||||
export function clearInputs(): void {
|
||||
delete process.env[getInputName(Inputs.Path)];
|
||||
delete process.env[getInputName(Inputs.Key)];
|
||||
delete process.env[getInputName(Inputs.RestoreKeys)];
|
||||
delete process.env[getInputName(Inputs.UploadChunkSize)];
|
||||
delete process.env[getInputName(Inputs.EnableCrossOsArchive)];
|
||||
delete process.env[getInputName(Inputs.FailOnCacheMiss)];
|
||||
delete process.env[getInputName(Inputs.LookupOnly)];
|
||||
delete process.env[getInputName(Inputs.RefreshCache)];
|
||||
}
|
||||
|
||||
/* istanbul ignore next */
|
||||
export const mockServer = setupServer(rest.delete('https://api.github.com/repos/owner/repo/actions/caches', (req, res, ctx) => {
|
||||
if (req.url?.searchParams?.get('key') === failureCacheKey) {
|
||||
return res(ctx.status(404),
|
||||
ctx.json({
|
||||
message: "Not Found",
|
||||
documentation_url: "https://docs.github.com/rest/actions/cache#delete-github-actions-caches-for-a-repository-using-a-cache-key"
|
||||
}));
|
||||
}
|
||||
else if (req.url?.searchParams?.get('key') === successCacheKey) {
|
||||
return res(ctx.status(200),
|
||||
ctx.json({
|
||||
total_count: 1,
|
||||
actions_caches: [{
|
||||
id: 15,
|
||||
ref: "refs/heads/main",
|
||||
key: successCacheKey,
|
||||
version: "93a0f912fdb70083e929c1bf564bca2050be1c4e0932f7f9e78465ddcfbcc8f6",
|
||||
last_accessed_at: "2022-12-29T22:06:42.683333300Z",
|
||||
created_at: "2022-12-29T22:06:42.683333300Z",
|
||||
size_in_bytes: 6057793
|
||||
}]
|
||||
}));
|
||||
}
|
||||
else if (req.url?.searchParams?.get('key') === passThroughCacheKey) {
|
||||
return req.passthrough();
|
||||
}
|
||||
}));
|
||||
Loading…
x
Reference in New Issue
Block a user