Merge pull request #1057 from akv-platform/cache-miss

Do not restore state if the cache does not exist
This commit is contained in:
Sergey Dolin 2023-07-27 10:21:37 +02:00 committed by GitHub
commit 60f51589e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 18 deletions

33
dist/index.js vendored
View File

@ -1611,15 +1611,28 @@ const unlinkSafely = (filePath) => {
/* ignore */
}
};
const resetCacheWithOctokit = (cacheKey) => __awaiter(void 0, void 0, void 0, function* () {
const getOctokitClient = () => {
const token = core.getInput('repo-token');
const client = (0, github_1.getOctokit)(token, undefined, plugin_retry_1.retry);
// TODO: better way to get repository?
const repo = process.env['GITHUB_REPOSITORY'];
return (0, github_1.getOctokit)(token, undefined, plugin_retry_1.retry);
};
const checkIfCacheExists = (cacheKey) => __awaiter(void 0, void 0, void 0, function* () {
const client = getOctokitClient();
try {
const issueResult = yield client.request(`/repos/${github_1.context.repo.owner}/${github_1.context.repo.repo}/actions/caches`);
const caches = issueResult.data['actions_caches'] || [];
return Boolean(caches.find(cache => cache['key'] === cacheKey));
}
catch (error) {
core.debug(`Error checking if cache exist: ${error.message}`);
}
return false;
});
const resetCacheWithOctokit = (cacheKey) => __awaiter(void 0, void 0, void 0, function* () {
const client = getOctokitClient();
core.debug(`remove cache "${cacheKey}"`);
try {
// TODO: replace with client.rest.
yield client.request(`DELETE /repos/${repo}/actions/caches?key=${cacheKey}`);
yield client.request(`DELETE /repos/${github_1.context.repo.owner}/${github_1.context.repo.repo}/actions/caches?key=${cacheKey}`);
}
catch (error) {
if (error.status) {
@ -1659,9 +1672,14 @@ class StateCacheStorage {
const filePath = path_1.default.join(tmpDir, STATE_FILE);
unlinkSafely(filePath);
try {
const cacheExists = yield checkIfCacheExists(CACHE_KEY);
if (!cacheExists) {
core.info('The saved state was not found, the process starts from the first issue.');
return '';
}
yield cache.restoreCache([path_1.default.dirname(filePath)], CACHE_KEY);
if (!fs_1.default.existsSync(filePath)) {
core.info('The stored state has not been found, probably because of the very first run or the previous run failed');
core.warning('Unknown error when unpacking the cache, the process starts from the first issue.');
return '';
}
return fs_1.default.readFileSync(path_1.default.join(tmpDir, STATE_FILE), {
@ -1766,7 +1784,8 @@ class State {
this.reset();
const serialized = yield this.stateStorage.restore();
this.deserialize(serialized);
core.info(`state: restored with info about ${this.processedIssuesIDs.size} issue(s)`);
if (this.processedIssuesIDs.size > 0)
core.info(`state: restored with info about ${this.processedIssuesIDs.size} issue(s)`);
});
}
}

View File

@ -3,7 +3,7 @@ import fs from 'fs';
import path from 'path';
import os from 'os';
import * as core from '@actions/core';
import {getOctokit} from '@actions/github';
import {context, getOctokit} from '@actions/github';
import {retry as octokitRetry} from '@octokit/plugin-retry';
import * as cache from '@actions/cache';
@ -25,16 +25,32 @@ const unlinkSafely = (filePath: string) => {
}
};
const resetCacheWithOctokit = async (cacheKey: string): Promise<void> => {
const getOctokitClient = () => {
const token = core.getInput('repo-token');
const client = getOctokit(token, undefined, octokitRetry);
// TODO: better way to get repository?
const repo = process.env['GITHUB_REPOSITORY'];
return getOctokit(token, undefined, octokitRetry);
};
const checkIfCacheExists = async (cacheKey: string): Promise<boolean> => {
const client = getOctokitClient();
try {
const issueResult = await client.request(
`/repos/${context.repo.owner}/${context.repo.repo}/actions/caches`
);
const caches: Array<{key?: string}> =
issueResult.data['actions_caches'] || [];
return Boolean(caches.find(cache => cache['key'] === cacheKey));
} catch (error) {
core.debug(`Error checking if cache exist: ${error.message}`);
}
return false;
};
const resetCacheWithOctokit = async (cacheKey: string): Promise<void> => {
const client = getOctokitClient();
core.debug(`remove cache "${cacheKey}"`);
try {
// TODO: replace with client.rest.
await client.request(
`DELETE /repos/${repo}/actions/caches?key=${cacheKey}`
`DELETE /repos/${context.repo.owner}/${context.repo.repo}/actions/caches?key=${cacheKey}`
);
} catch (error) {
if (error.status) {
@ -76,11 +92,19 @@ export class StateCacheStorage implements IStateStorage {
const filePath = path.join(tmpDir, STATE_FILE);
unlinkSafely(filePath);
try {
const cacheExists = await checkIfCacheExists(CACHE_KEY);
if (!cacheExists) {
core.info(
'The saved state was not found, the process starts from the first issue.'
);
return '';
}
await cache.restoreCache([path.dirname(filePath)], CACHE_KEY);
if (!fs.existsSync(filePath)) {
core.info(
'The stored state has not been found, probably because of the very first run or the previous run failed'
core.warning(
'Unknown error when unpacking the cache, the process starts from the first issue.'
);
return '';
}

View File

@ -64,8 +64,9 @@ export class State implements IState {
this.reset();
const serialized = await this.stateStorage.restore();
this.deserialize(serialized);
core.info(
`state: restored with info about ${this.processedIssuesIDs.size} issue(s)`
);
if (this.processedIssuesIDs.size > 0)
core.info(
`state: restored with info about ${this.processedIssuesIDs.size} issue(s)`
);
}
}