3
0
Fork 0
mirror of https://code.forgejo.org/actions/cache.git synced 2025-04-23 03:45:31 +00:00

Allow updating caches

This commit is contained in:
Gregorio Litenstein 2023-04-07 21:39:37 -04:00
parent 36f1e144e1
commit d69c349a03
No known key found for this signature in database
GPG key ID: 4EB52A1A9CE2C63F
7 changed files with 3802 additions and 12803 deletions

View file

@ -5,7 +5,8 @@ export enum Inputs {
UploadChunkSize = "upload-chunk-size", // Input for cache, save action
EnableCrossOsArchive = "enableCrossOsArchive", // Input for cache, restore, save action
FailOnCacheMiss = "fail-on-cache-miss", // Input for cache, restore action
LookupOnly = "lookup-only" // Input for cache, restore action
LookupOnly = "lookup-only", // Input for cache, restore action
RefreshCache = "refresh-cache" // Input for cache, save action
}
export enum Outputs {

View file

@ -43,15 +43,38 @@ export async function saveImpl(
return;
}
// If matched restore key is same as primary key, then do not save cache
// NO-OP in case of SaveOnly action
const refreshCache: boolean = utils.getInputAsBool(
Inputs.RefreshCache,
{ required: false }
);
// If matched restore key is same as primary key, either try to refresh the cache, or just notify and do not save (NO-OP in case of SaveOnly action)
const restoredKey = stateProvider.getCacheState();
if (utils.isExactKeyMatch(primaryKey, restoredKey)) {
core.info(
`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`
);
return;
const { GITHUB_TOKEN, GITHUB_REPOSITORY } = process.env || null;
if (GITHUB_TOKEN && GITHUB_REPOSITORY && refreshCache === true) {
core.info(
`Cache hit occurred on the primary key ${primaryKey}, attempting to refresh the contents of the cache.`
);
const [_owner, _repo] = GITHUB_REPOSITORY.split(`/`);
if (_owner && _repo) {
await utils.deleteCacheByKey(primaryKey, _owner, _repo);
}
} else {
if (refreshCache === true) {
utils.logWarning(
`Can't refresh cache, either the repository info or a valid token are missing.`
);
return;
} else {
core.info(
`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`
);
return;
}
}
}
const cachePaths = utils.getInputAsArray(Inputs.Path, {

View file

@ -1,7 +1,10 @@
import * as cache from "@actions/cache";
import * as core from "@actions/core";
import { RequestError } from "@octokit/request-error"
import { OctokitResponse } from "@octokit/types"
import { RefKey } from "../constants";
const { Octokit } = require("@octokit/action");
export function isGhes(): boolean {
const ghUrl = new URL(
@ -25,6 +28,29 @@ export function isExactKeyMatch(key: string, cacheKey?: string): boolean {
);
}
export async function deleteCacheByKey(key: string, owner: string, repo: string) {
const octokit = new Octokit();
let response;
try {
response = await octokit.rest.actions.deleteActionsCacheByKey({
owner: owner,
repo: repo,
key: key
});
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(`${err.name} '${err.status}: ${errData?.message}' trying to delete cache with key: ${key}`);
}
response = e;
}
return response;
}
export function logWarning(message: string): void {
const warningPrefix = "[warning]";
core.info(`${warningPrefix}${message}`);