mirror of
https://github.com/actions/cache.git
synced 2026-07-06 04:30:20 +00:00
Compare commits
35 Commits
4043ab8d77
...
11a6324cc7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11a6324cc7 | ||
|
|
8ac3d1967f | ||
|
|
ceefdff90e | ||
|
|
0e801000fd | ||
|
|
da1b6c90c6 | ||
|
|
0417c21165 | ||
|
|
203bc27916 | ||
|
|
1328a18e7e | ||
|
|
d35302b225 | ||
|
|
34ae092a8c | ||
|
|
39c1f23499 | ||
|
|
5a3ec84eff | ||
|
|
7de21022a7 | ||
|
|
76d40dd347 | ||
|
|
76dd5eb692 | ||
|
|
8c80c27c5e | ||
|
|
45cfd0e7ff | ||
|
|
edd449b9cf | ||
|
|
0576707e37 | ||
|
|
3105dc9754 | ||
|
|
9450d42d15 | ||
|
|
7d05b27fb9 | ||
|
|
507b84c6a6 | ||
|
|
f248408e15 | ||
|
|
c30eb5542e | ||
|
|
5b6ae99d8b | ||
|
|
eca7c65a55 | ||
|
|
1b5d75f5cf | ||
|
|
d4323d4df1 | ||
|
|
da26677639 | ||
|
|
7921ae235b | ||
|
|
3937731706 | ||
|
|
0c907a75c2 | ||
|
|
710893c236 | ||
|
|
9fa7e61ec7 |
@ -2,7 +2,7 @@ name: 'Publish Immutable Action Version'
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
release:
|
release:
|
||||||
types: [published]
|
types: [released]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
|
|||||||
BIN
.licenses/NOTICE
generated
BIN
.licenses/NOTICE
generated
Binary file not shown.
BIN
.licenses/npm/@actions/cache.dep.yml
generated
BIN
.licenses/npm/@actions/cache.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@actions/exec.dep.yml
generated
BIN
.licenses/npm/@actions/exec.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/action.dep.yml
generated
BIN
.licenses/npm/@octokit/action.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@octokit/plugin-paginate-rest.dep.yml
generated
BIN
.licenses/npm/@octokit/plugin-paginate-rest.dep.yml
generated
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/plugin-framework.dep.yml
generated
BIN
.licenses/npm/@protobuf-ts/plugin-framework.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/plugin.dep.yml
generated
BIN
.licenses/npm/@protobuf-ts/plugin.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/protoc.dep.yml
generated
BIN
.licenses/npm/@protobuf-ts/protoc.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/runtime-rpc.dep.yml
generated
BIN
.licenses/npm/@protobuf-ts/runtime-rpc.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/@protobuf-ts/runtime.dep.yml
generated
BIN
.licenses/npm/@protobuf-ts/runtime.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/agent-base-6.0.2.dep.yml
generated
BIN
.licenses/npm/agent-base-6.0.2.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/before-after-hook.dep.yml
generated
BIN
.licenses/npm/before-after-hook.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/camel-case.dep.yml
generated
BIN
.licenses/npm/camel-case.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/commander.dep.yml
generated
BIN
.licenses/npm/commander.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/concat-map.dep.yml
generated
BIN
.licenses/npm/concat-map.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/deprecation.dep.yml
generated
BIN
.licenses/npm/deprecation.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/dot-object.dep.yml
generated
BIN
.licenses/npm/dot-object.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/event-target-shim.dep.yml
generated
BIN
.licenses/npm/event-target-shim.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/events.dep.yml
generated
BIN
.licenses/npm/events.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/fs.realpath.dep.yml
generated
BIN
.licenses/npm/fs.realpath.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/glob.dep.yml
generated
BIN
.licenses/npm/glob.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/https-proxy-agent-5.0.1.dep.yml
generated
BIN
.licenses/npm/https-proxy-agent-5.0.1.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/inflight.dep.yml
generated
BIN
.licenses/npm/inflight.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/inherits.dep.yml
generated
BIN
.licenses/npm/inherits.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/lodash.dep.yml
generated
BIN
.licenses/npm/lodash.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/lower-case.dep.yml
generated
BIN
.licenses/npm/lower-case.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/minimatch.dep.yml
generated
BIN
.licenses/npm/minimatch.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/no-case.dep.yml
generated
BIN
.licenses/npm/no-case.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/pascal-case.dep.yml
generated
BIN
.licenses/npm/pascal-case.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/path-is-absolute.dep.yml
generated
BIN
.licenses/npm/path-is-absolute.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/path-to-regexp.dep.yml
generated
BIN
.licenses/npm/path-to-regexp.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/prettier.dep.yml
generated
BIN
.licenses/npm/prettier.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/sax.dep.yml
generated
BIN
.licenses/npm/sax.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/semver.dep.yml
generated
BIN
.licenses/npm/semver.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/ts-poet.dep.yml
generated
BIN
.licenses/npm/ts-poet.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/tslib-1.14.1.dep.yml
generated
BIN
.licenses/npm/tslib-1.14.1.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/twirp-ts.dep.yml
generated
BIN
.licenses/npm/twirp-ts.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/typescript.dep.yml
generated
BIN
.licenses/npm/typescript.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/webidl-conversions.dep.yml
generated
BIN
.licenses/npm/webidl-conversions.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/whatwg-url.dep.yml
generated
BIN
.licenses/npm/whatwg-url.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/xmlbuilder.dep.yml
generated
BIN
.licenses/npm/xmlbuilder.dep.yml
generated
Binary file not shown.
BIN
.licenses/npm/yaml.dep.yml
generated
BIN
.licenses/npm/yaml.dep.yml
generated
Binary file not shown.
@ -7,5 +7,6 @@
|
|||||||
"trailingComma": "none",
|
"trailingComma": "none",
|
||||||
"bracketSpacing": true,
|
"bracketSpacing": true,
|
||||||
"arrowParens": "avoid",
|
"arrowParens": "avoid",
|
||||||
"parser": "typescript"
|
"parser": "typescript",
|
||||||
|
"endOfLine": "lf"
|
||||||
}
|
}
|
||||||
12
RELEASES.md
12
RELEASES.md
@ -1,5 +1,17 @@
|
|||||||
# Releases
|
# Releases
|
||||||
|
|
||||||
|
### 4.2.3
|
||||||
|
|
||||||
|
- Bump `@actions/cache` to v4.0.3 (obfuscates SAS token in debug logs for cache entries)
|
||||||
|
|
||||||
|
### 4.2.2
|
||||||
|
|
||||||
|
- Bump `@actions/cache` to v4.0.2
|
||||||
|
|
||||||
|
### 4.2.1
|
||||||
|
|
||||||
|
- Bump `@actions/cache` to v4.0.1
|
||||||
|
|
||||||
### 4.2.0
|
### 4.2.0
|
||||||
|
|
||||||
TLDR; 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.
|
TLDR; 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.
|
||||||
|
|||||||
5971
dist/restore-only/index.js
vendored
5971
dist/restore-only/index.js
vendored
File diff suppressed because one or more lines are too long
5971
dist/restore/index.js
vendored
5971
dist/restore/index.js
vendored
File diff suppressed because one or more lines are too long
5971
dist/save-only/index.js
vendored
5971
dist/save-only/index.js
vendored
File diff suppressed because one or more lines are too long
5971
dist/save/index.js
vendored
5971
dist/save/index.js
vendored
File diff suppressed because one or more lines are too long
1768
package-lock.json
generated
1768
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
12
package.json
12
package.json
@ -1,15 +1,15 @@
|
|||||||
{
|
{
|
||||||
"name": "cache",
|
"name": "cache",
|
||||||
"version": "4.2.0",
|
"version": "4.2.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Cache dependencies and build outputs",
|
"description": "Cache dependencies and build outputs",
|
||||||
"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": "tsc --noEmit && jest --coverage",
|
"test": "tsc --noEmit && jest --coverage",
|
||||||
"lint": "eslint **/*.ts --cache",
|
"lint": "eslint src/**/*.ts --cache __tests__/*.ts --cache",
|
||||||
"format": "prettier --write **/*.ts",
|
"format": "prettier --write **/**/*.ts",
|
||||||
"format-check": "prettier --check **/*.ts"
|
"format-check": "prettier --check **/**/*.ts"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -23,11 +23,11 @@
|
|||||||
"author": "GitHub",
|
"author": "GitHub",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/cache": "^4.0.0",
|
"@actions/cache": "^4.0.3",
|
||||||
"@actions/core": "^1.11.1",
|
"@actions/core": "^1.11.1",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^1.1.1",
|
||||||
"@actions/io": "^1.1.2",
|
"@actions/io": "^1.1.2",
|
||||||
"@octokit/action": "^4.0.10"
|
"@octokit/action": "^5.0.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^27.5.2",
|
"@types/jest": "^27.5.2",
|
||||||
|
|||||||
@ -1,10 +1,9 @@
|
|||||||
import * as cache from "@actions/cache";
|
import * as cache from "@actions/cache";
|
||||||
import * as core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import { RequestError } from "@octokit/request-error"
|
import { Octokit } from "@octokit/action";
|
||||||
import { OctokitResponse } from "@octokit/types"
|
import { RequestError } from "@octokit/request-error";
|
||||||
|
|
||||||
import { RefKey } from "../constants";
|
import { RefKey } from "../constants";
|
||||||
const { Octokit } = require("@octokit/action");
|
|
||||||
|
|
||||||
export function isGhes(): boolean {
|
export function isGhes(): boolean {
|
||||||
const ghUrl = new URL(
|
const ghUrl = new URL(
|
||||||
@ -33,54 +32,69 @@ export function logWarning(message: string): void {
|
|||||||
core.info(`${warningPrefix}${message}`);
|
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
|
||||||
|
): Promise<number | void> {
|
||||||
const octokit = new Octokit();
|
const octokit = new Octokit();
|
||||||
let response;
|
let response;
|
||||||
try {
|
try {
|
||||||
const gitRef = process.env[RefKey];
|
const gitRef = process.env[RefKey];
|
||||||
let cacheEntry = await octokit.rest.actions.getActionsCacheList({
|
const cacheEntry = await octokit.rest.actions.getActionsCacheList({
|
||||||
owner: owner,
|
owner: owner,
|
||||||
repo: repo,
|
repo: repo,
|
||||||
key: key,
|
key: key,
|
||||||
ref: gitRef
|
ref: gitRef
|
||||||
});
|
});
|
||||||
const { data: {
|
const {
|
||||||
total_count,
|
data: { total_count, actions_caches }
|
||||||
actions_caches
|
|
||||||
}
|
|
||||||
} = cacheEntry;
|
} = 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 || 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) {
|
if (total_count > 1) {
|
||||||
exports.logWarning(`More than one cache entry found for key ${key}`);
|
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}.`);
|
} 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.
|
// This situation is likely never actually going to come up.
|
||||||
// Istanbul is being dumb and I can't ignore this path.
|
// Istanbul is being dumb and I can't ignore this path.
|
||||||
else if (total_count !== actions_caches.length) {
|
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.`);
|
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}.`)
|
core.info(`Skip trying to delete cache entry for key ${key}.`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let id = actions_caches[0].id;
|
const id = actions_caches[0].id;
|
||||||
response = await octokit.rest.actions.deleteActionsCacheById({
|
if (id) {
|
||||||
owner: owner,
|
response = await octokit.rest.actions.deleteActionsCacheById({
|
||||||
repo: repo,
|
owner: owner,
|
||||||
cache_id: id
|
repo: repo,
|
||||||
|
cache_id: id
|
||||||
});
|
});
|
||||||
if (response.status === 204) {
|
if (response.status === 204) {
|
||||||
core.info(`Succesfully deleted cache with key: ${key}, id: ${id}`);
|
core.info(
|
||||||
return 204;
|
`Succesfully deleted cache with key: ${key}, id: ${id}`
|
||||||
|
);
|
||||||
|
return 204;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof RequestError) {
|
if (e instanceof RequestError) {
|
||||||
let err = e as RequestError;
|
const err = e as RequestError;
|
||||||
let errData = err.response?.data as any | undefined;
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
exports.logWarning(`Github API reported error: ${err.name} '${err.status}: ${errData?.message}'`);
|
const errMessage = (err.response?.data as any).message;
|
||||||
|
exports.logWarning(
|
||||||
|
`Github API reported error: ${err.name} '${err.status}: ${errMessage}'`
|
||||||
|
);
|
||||||
}
|
}
|
||||||
core.info(`Couldn't delete cache entry for key ${key}.`)
|
core.info(`Couldn't delete cache entry for key ${key}.`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,18 @@
|
|||||||
/* istanbul ignore file */
|
/* istanbul ignore file */
|
||||||
|
|
||||||
import { Inputs } from "../constants";
|
|
||||||
import { rest } from "msw";
|
import { rest } from "msw";
|
||||||
import { setupServer } from "msw/node";
|
import { setupServer } from "msw/node";
|
||||||
import nock from "nock";
|
|
||||||
|
|
||||||
export const successCacheKey = "Linux-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
import { Inputs } from "../constants";
|
||||||
export const wrongRefCacheKey = "Linux-latest-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
|
||||||
export const failureCacheKey = "Windows-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
export const successCacheKey =
|
||||||
export const passThroughCacheKey = "macOS-node-bb828da54c148048dd17899ba9fda624811cfb43";
|
"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 successCacheId = 1337;
|
||||||
const failureCacheId = 69;
|
const failureCacheId = 69;
|
||||||
|
|
||||||
@ -61,79 +65,109 @@ export function clearInputs(): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const mockServer = setupServer(
|
export const mockServer = setupServer(
|
||||||
rest.delete('https://api.github.com/repos/owner/repo/actions/caches/', (req, res, ctx) => {
|
rest.delete(
|
||||||
return res(ctx.status(422),
|
"https://api.github.com/repos/owner/repo/actions/caches/",
|
||||||
ctx.json({
|
(req, res, ctx) => {
|
||||||
message: "Invalid request.\n\nMissing required query parameter key",
|
return res(
|
||||||
documentation_url: "https://docs.github.com/rest/actions/cache#delete-github-actions-caches-for-a-repository-using-a-cache-key",
|
ctx.status(422),
|
||||||
})
|
|
||||||
)
|
|
||||||
}),
|
|
||||||
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({
|
ctx.json({
|
||||||
message: "Not Found",
|
message:
|
||||||
documentation_url: "https://docs.github.com/rest/actions/cache#delete-a-github-actions-cache-for-a-repository-using-a-cache-id"
|
"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"
|
||||||
|
})
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return res(ctx.status(204));
|
),
|
||||||
}),
|
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.
|
// 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) => {
|
rest.get(
|
||||||
let key : string = req.url?.searchParams?.get('key') || '';
|
"https://api.github.com/repos/owner/repo/actions/caches",
|
||||||
let ref : string = req.url?.searchParams?.get('ref') || '';
|
(req, res, ctx) => {
|
||||||
if (key === '' || ref === '') {
|
const key: string = req.url?.searchParams?.get("key") || "";
|
||||||
return res(ctx.status(200),
|
const ref: string = req.url?.searchParams?.get("ref") || "";
|
||||||
ctx.json({
|
if (key === "" || ref === "") {
|
||||||
total_count: 2,
|
return res(
|
||||||
actions_caches: [{
|
ctx.status(200),
|
||||||
id: 15,
|
ctx.json({
|
||||||
ref: "refs/heads/main",
|
total_count: 2,
|
||||||
key: failureCacheKey,
|
actions_caches: [
|
||||||
version: "73885106f58cc52a7df9ec4d4a5622a5614813162cb516c759a30af6bf56e6f0",
|
{
|
||||||
last_accessed_at: "2022-12-29T22:06:42.683333300Z",
|
id: 15,
|
||||||
created_at: "2022-12-29T22:06:42.683333300Z",
|
ref: "refs/heads/main",
|
||||||
size_in_bytes: 6057793
|
key: failureCacheKey,
|
||||||
},
|
version:
|
||||||
{
|
"73885106f58cc52a7df9ec4d4a5622a5614813162cb516c759a30af6bf56e6f0",
|
||||||
id: 16,
|
last_accessed_at:
|
||||||
ref: "refs/heads/another-feature-branch",
|
"2022-12-29T22:06:42.683333300Z",
|
||||||
key: failureCacheKey,
|
created_at: "2022-12-29T22:06:42.683333300Z",
|
||||||
version: "73885106f58cc52a7df9ec4d4a5622a5614813162cb516c759a30af6bf56e6f0",
|
size_in_bytes: 6057793
|
||||||
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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return req.passthrough();
|
||||||
}
|
}
|
||||||
// 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
|
|
||||||
}]
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return req.passthrough();
|
|
||||||
})
|
|
||||||
);
|
);
|
||||||
@ -38,9 +38,8 @@ From `v3.2.3` cache is cross-os compatible when `enableCrossOsArchive` input is
|
|||||||
|
|
||||||
## Force deletion of caches overriding default cache eviction policy
|
## Force deletion of caches overriding default cache eviction policy
|
||||||
|
|
||||||
Caches have [branch scope restriction](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#restrictions-for-accessing-a-cache) in place. This means that if caches for a specific branch are using a lot of storage quota, it may result into more frequently used caches from `default` branch getting thrashed. For example, if there are many pull requests happening on a repo and are creating caches, these cannot be used in default branch scope but will still occupy a lot of space till they get cleaned up by [eviction policy](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#usage-limits-and-eviction-policy). But sometime we want to clean them up on a faster cadence so as to ensure default branch is not thrashing. In order to achieve this, [gh-actions-cache cli](https://github.com/actions/gh-actions-cache/) can be used to delete caches for specific branches.
|
Caches have [branch scope restriction](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#restrictions-for-accessing-a-cache) in place. This means that if caches for a specific branch are using a lot of storage quota, it may result into more frequently used caches from `default` branch getting thrashed. For example, if there are many pull requests happening on a repo and are creating caches, these cannot be used in default branch scope but will still occupy a lot of space till they get cleaned up by [eviction policy](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows#usage-limits-and-eviction-policy). But sometime we want to clean them up on a faster cadence so as to ensure default branch is not thrashing.
|
||||||
|
|
||||||
This workflow uses `gh-actions-cache` to delete all the caches created by a branch.
|
|
||||||
<details>
|
<details>
|
||||||
<summary>Example</summary>
|
<summary>Example</summary>
|
||||||
|
|
||||||
@ -61,29 +60,23 @@ jobs:
|
|||||||
actions: write
|
actions: write
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Cleanup
|
- name: Cleanup
|
||||||
run: |
|
run: |
|
||||||
gh extension install actions/gh-actions-cache
|
|
||||||
|
|
||||||
REPO=${{ github.repository }}
|
|
||||||
BRANCH=refs/pull/${{ github.event.pull_request.number }}/merge
|
|
||||||
|
|
||||||
echo "Fetching list of cache key"
|
echo "Fetching list of cache key"
|
||||||
cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH | cut -f 1 )
|
cacheKeysForPR=$(gh cache list --ref $BRANCH --limit 100 --json id --jq '.[].id')
|
||||||
|
|
||||||
## Setting this to not fail the workflow while deleting cache keys.
|
## Setting this to not fail the workflow while deleting cache keys.
|
||||||
set +e
|
set +e
|
||||||
echo "Deleting caches..."
|
echo "Deleting caches..."
|
||||||
for cacheKey in $cacheKeysForPR
|
for cacheKey in $cacheKeysForPR
|
||||||
do
|
do
|
||||||
gh actions-cache delete $cacheKey -R $REPO -B $BRANCH --confirm
|
gh cache delete $cacheKey
|
||||||
done
|
done
|
||||||
echo "Done"
|
echo "Done"
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
GH_REPO: ${{ github.repository }}
|
||||||
|
BRANCH: refs/pull/${{ github.event.pull_request.number }}/merge
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user