feat: use OS and working-directory as cache key (#1032)
This commit is contained in:
parent
dbe4fc23f1
commit
21e9e6b47f
@ -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
13
dist/post_run/index.js
generated
vendored
@ -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
13
dist/run/index.js
generated
vendored
@ -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}`);
|
||||||
|
17
src/cache.ts
17
src/cache.ts
@ -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`)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user