99 lines
2.6 KiB
JavaScript
99 lines
2.6 KiB
JavaScript
const fs = require('fs')
|
|
const path = require('path')
|
|
const cache = require('@actions/cache')
|
|
const core = require('@actions/core')
|
|
const glob = require('@actions/glob')
|
|
const config = require('./config')
|
|
const { getFolderSize } = require('./util')
|
|
const process = require('node:process');
|
|
|
|
async function run() {
|
|
await saveCaches()
|
|
process.exit(0)
|
|
}
|
|
|
|
async function saveCaches() {
|
|
if (!config.cacheSave) {
|
|
core.info('Cache saving is disabled (cache-save: false)')
|
|
return
|
|
}
|
|
|
|
await saveCache(config.bazeliskCache)
|
|
await saveCache(config.diskCache)
|
|
await saveCache(config.repositoryCache)
|
|
await saveExternalCaches(config.externalCache)
|
|
}
|
|
|
|
async function saveExternalCaches(cacheConfig) {
|
|
if (!cacheConfig.enabled) {
|
|
return
|
|
}
|
|
|
|
const globber = await glob.create(
|
|
`${config.paths.bazelExternal}/*`,
|
|
{ implicitDescendants: false }
|
|
)
|
|
const externalPaths = await globber.glob()
|
|
const savedCaches = []
|
|
|
|
for (const externalPath of externalPaths) {
|
|
const size = await getFolderSize(externalPath)
|
|
const sizeMB = (size / 1024 / 1024).toFixed(2)
|
|
core.debug(`${externalPath} size is ${sizeMB}MB`)
|
|
|
|
if (sizeMB >= cacheConfig.minSize) {
|
|
const name = path.basename(externalPath)
|
|
await saveCache({
|
|
enabled: cacheConfig[name]?.enabled ?? cacheConfig.default.enabled,
|
|
files: cacheConfig[name]?.files || cacheConfig.default.files,
|
|
name: cacheConfig.default.name(name),
|
|
paths: cacheConfig.default.paths(name)
|
|
})
|
|
savedCaches.push(name)
|
|
}
|
|
}
|
|
|
|
if (savedCaches.length > 0) {
|
|
const path = cacheConfig.manifest.path
|
|
fs.writeFileSync(path, savedCaches.join('\n'))
|
|
await saveCache({
|
|
enabled: true,
|
|
files: cacheConfig.manifest.files,
|
|
name: cacheConfig.manifest.name,
|
|
paths: [path]
|
|
})
|
|
}
|
|
}
|
|
|
|
async function saveCache(cacheConfig) {
|
|
if (!cacheConfig.enabled) {
|
|
return
|
|
}
|
|
|
|
const cacheHit = core.getState(`${cacheConfig.name}-cache-hit`)
|
|
core.debug(`${cacheConfig.name}-cache-hit is ${cacheHit}`)
|
|
if (cacheHit === 'true') {
|
|
return
|
|
}
|
|
|
|
try {
|
|
core.startGroup(`Save cache for ${cacheConfig.name}`)
|
|
const paths = cacheConfig.paths
|
|
const hash = await glob.hashFiles(
|
|
cacheConfig.files.join('\n'),
|
|
undefined,
|
|
// We don't want to follow symlinks as it's extremely slow on macOS.
|
|
{ followSymbolicLinks: false }
|
|
)
|
|
const key = `${config.baseCacheKey}-${cacheConfig.name}-${hash}`
|
|
core.debug(`Attempting to save ${paths} cache to ${key}`)
|
|
await cache.saveCache(paths, key)
|
|
core.info('Successfully saved cache')
|
|
} catch (error) {
|
|
core.warning(error.stack)
|
|
} finally {
|
|
core.endGroup()
|
|
}
|
|
}
|
|
|
|
run()
|