feat: use OS and working-directory as cache key (#1032)

This commit is contained in:
Ludovic Fernandez 2024-05-04 18:43:48 +02:00 committed by GitHub
parent dbe4fc23f1
commit 21e9e6b47f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 33 additions and 15 deletions

View File

@ -308,10 +308,11 @@ Inside our action, we perform 3 steps:
### Caching internals ### Caching internals
1. We save and restore the following directory: `~/.cache/golangci-lint`. 1. We save and restore the following directory: `~/.cache/golangci-lint`.
2. The primary caching key looks like `golangci-lint.cache-{interval_number}-{go.mod_hash}`. 2. The primary caching key looks like `golangci-lint.cache-{runner_os}-{working_directory}-{interval_number}-{go.mod_hash}`.
Interval number ensures that we periodically invalidate our cache (every 7 days). Interval number ensures that we periodically invalidate our cache (every 7 days).
`go.mod` hash ensures that we invalidate the cache early - as soon as dependencies have changed. `go.mod` hash ensures that we invalidate the cache early - as soon as dependencies have changed.
3. We use [restore keys](https://help.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key): `golangci-lint.cache-{interval_number}-`. 3. We use [restore keys](https://help.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows#matching-a-cache-key):
`golangci-lint.cache-{runner_os}-{working_directory}-{interval_number}-`.
GitHub matches keys by prefix if we have no exact match for the primary cache. GitHub matches keys by prefix if we have no exact match for the primary cache.
This scheme is basic and needs improvements. Pull requests and ideas are welcome. This scheme is basic and needs improvements. Pull requests and ideas are welcome.

13
dist/post_run/index.js generated vendored
View File

@ -88824,12 +88824,17 @@ const getIntervalKey = (invalidationIntervalDays) => {
}; };
async function buildCacheKeys() { async function buildCacheKeys() {
const keys = []; const keys = [];
const invalidationIntervalDays = parseInt(core.getInput(`cache-invalidation-interval`, { required: true }).trim()); // Cache by OS.
// Periodically invalidate a cache because a new code being added. let cacheKey = `golangci-lint.cache-${process.env?.RUNNER_OS}-`;
let cacheKey = `golangci-lint.cache-${getIntervalKey(invalidationIntervalDays)}-`;
keys.push(cacheKey);
// Get working directory from input // Get working directory from input
const workingDirectory = core.getInput(`working-directory`); const workingDirectory = core.getInput(`working-directory`);
if (workingDirectory) {
cacheKey += `${workingDirectory}-`;
}
// Periodically invalidate a cache because a new code being added.
const invalidationIntervalDays = parseInt(core.getInput(`cache-invalidation-interval`, { required: true }).trim());
cacheKey += `${getIntervalKey(invalidationIntervalDays)}-`;
keys.push(cacheKey);
// create path to go.mod prepending the workingDirectory if it exists // create path to go.mod prepending the workingDirectory if it exists
const goModPath = path_1.default.join(workingDirectory, `go.mod`); const goModPath = path_1.default.join(workingDirectory, `go.mod`);
core.info(`Checking for go.mod: ${goModPath}`); core.info(`Checking for go.mod: ${goModPath}`);

13
dist/run/index.js generated vendored
View File

@ -88824,12 +88824,17 @@ const getIntervalKey = (invalidationIntervalDays) => {
}; };
async function buildCacheKeys() { async function buildCacheKeys() {
const keys = []; const keys = [];
const invalidationIntervalDays = parseInt(core.getInput(`cache-invalidation-interval`, { required: true }).trim()); // Cache by OS.
// Periodically invalidate a cache because a new code being added. let cacheKey = `golangci-lint.cache-${process.env?.RUNNER_OS}-`;
let cacheKey = `golangci-lint.cache-${getIntervalKey(invalidationIntervalDays)}-`;
keys.push(cacheKey);
// Get working directory from input // Get working directory from input
const workingDirectory = core.getInput(`working-directory`); const workingDirectory = core.getInput(`working-directory`);
if (workingDirectory) {
cacheKey += `${workingDirectory}-`;
}
// Periodically invalidate a cache because a new code being added.
const invalidationIntervalDays = parseInt(core.getInput(`cache-invalidation-interval`, { required: true }).trim());
cacheKey += `${getIntervalKey(invalidationIntervalDays)}-`;
keys.push(cacheKey);
// create path to go.mod prepending the workingDirectory if it exists // create path to go.mod prepending the workingDirectory if it exists
const goModPath = path_1.default.join(workingDirectory, `go.mod`); const goModPath = path_1.default.join(workingDirectory, `go.mod`);
core.info(`Checking for go.mod: ${goModPath}`); core.info(`Checking for go.mod: ${goModPath}`);

View File

@ -38,15 +38,22 @@ const getIntervalKey = (invalidationIntervalDays: number): string => {
async function buildCacheKeys(): Promise<string[]> { async function buildCacheKeys(): Promise<string[]> {
const keys = [] const keys = []
const invalidationIntervalDays = parseInt(core.getInput(`cache-invalidation-interval`, { required: true }).trim()) // Cache by OS.
let cacheKey = `golangci-lint.cache-${process.env?.RUNNER_OS}-`
// Periodically invalidate a cache because a new code being added.
let cacheKey = `golangci-lint.cache-${getIntervalKey(invalidationIntervalDays)}-`
keys.push(cacheKey)
// Get working directory from input // Get working directory from input
const workingDirectory = core.getInput(`working-directory`) const workingDirectory = core.getInput(`working-directory`)
if (workingDirectory) {
cacheKey += `${workingDirectory}-`
}
// Periodically invalidate a cache because a new code being added.
const invalidationIntervalDays = parseInt(core.getInput(`cache-invalidation-interval`, { required: true }).trim())
cacheKey += `${getIntervalKey(invalidationIntervalDays)}-`
keys.push(cacheKey)
// create path to go.mod prepending the workingDirectory if it exists // create path to go.mod prepending the workingDirectory if it exists
const goModPath = path.join(workingDirectory, `go.mod`) const goModPath = path.join(workingDirectory, `go.mod`)