setup-bazel/config.js
2023-01-04 16:31:00 -08:00

121 lines
3.4 KiB
JavaScript

const fs = require('fs')
const os = require('os')
const yaml = require('yaml')
const core = require('@actions/core')
const cacheVersion = core.getInput('cache-version')
const externalCacheConfig = yaml.parse(core.getInput('external-cache'))
const homeDir = os.homedir()
const platform = os.platform()
let bazelDisk = core.toPosixPath(`${homeDir}/.cache/bazel-disk`)
let bazelRepository = core.toPosixPath(`${homeDir}/.cache/bazel-repo`)
let bazelOutputBase = `${homeDir}/.bazel`
let userCacheDir = `${homeDir}/.cache`
switch (platform) {
case 'darwin':
userCacheDir = `${homeDir}/Library/Caches`
break
case 'win32':
bazelDisk = 'D:/_bazel-disk'
bazelRepository = 'D:/_bazel-repo'
bazelOutputBase = 'D:/_bazel'
userCacheDir = `${homeDir}/AppData/Local`
break
}
const baseCacheKey = `setup-bazel-${cacheVersion}-${platform}`
const bazelrc = core.getMultilineInput('bazelrc')
const diskCacheConfig = core.getInput('disk-cache')
const diskCacheEnabled = diskCacheConfig.length > 0
let diskCacheName = 'disk'
if (diskCacheEnabled) {
bazelrc.push(`build --disk_cache=${bazelDisk}`)
diskCacheName = `${diskCacheName}-${diskCacheConfig}`
}
const repositoryCacheEnabled = core.getBooleanInput('repository-cache')
if (repositoryCacheEnabled) {
bazelrc.push(`build --repository_cache=${bazelRepository}`)
}
const googleCredentials = core.getInput('google-credentials')
const googleCredentialsSaved = (core.getState('google-credentials-path').length > 0)
if (googleCredentials.length > 0 && !googleCredentialsSaved) {
const tmpDir = core.toPosixPath(fs.mkdtempSync(os.tmpdir()))
const googleCredentialsPath = `${tmpDir}/key.json`
fs.writeFileSync(googleCredentialsPath, googleCredentials)
bazelrc.push(`build --google_credentials=${googleCredentialsPath}`)
core.saveState('google-credentials-path', googleCredentialsPath)
}
const bazelExternal = core.toPosixPath(`${bazelOutputBase}/external`)
const externalCache = {}
if (externalCacheConfig) {
externalCache.enabled = true
externalCache.minSize = 10 // MB
externalCache.baseCacheKey = `${baseCacheKey}-external-`
externalCache.regexp = `^${baseCacheKey}-external-(?<name>.+)-[a-z0-9]+$`
externalCache.default = {
files: [
'WORKSPACE.bazel',
'WORKSPACE'
]
}
externalCache.name = (name) => {
return `external-${name}`
}
externalCache.paths = (name) => {
return [
`${bazelExternal}/@${name}.marker`,
`${bazelExternal}/${name}`
]
}
for (const name in externalCacheConfig) {
externalCache[name] = {
files: Array(externalCacheConfig[name]).flat()
}
}
}
module.exports = {
baseCacheKey,
bazeliskCache: {
enabled: core.getBooleanInput('bazelisk-cache'),
files: ['.bazelversion'],
name: 'bazelisk',
paths: [core.toPosixPath(`${userCacheDir}/bazelisk`)]
},
bazelrc,
diskCache: {
enabled: diskCacheEnabled,
files: [
'**/BUILD.bazel',
'**/BUILD'
],
name: diskCacheName,
paths: [bazelDisk]
},
externalCache,
paths: {
bazelExternal,
bazelOutputBase: core.toPosixPath(bazelOutputBase),
bazelrc: core.toPosixPath(`${homeDir}/.bazelrc`)
},
platform,
repositoryCache: {
enabled: repositoryCacheEnabled,
files: [
'WORKSPACE.bazel',
'WORKSPACE'
],
name: 'repository',
paths: [bazelRepository]
},
token: core.getInput('token'),
useGnuTarOnWindows: core.getBooleanInput('use-gnu-tar-on-windows')
}