Compare commits

..

1 commit

Author SHA1 Message Date
Alex Rodionov
3f6bfb33d0 Add disk-cache-files input to support multiple modules
Fixes #67

Add support for overriding disk cache files for multiple modules in the repository.

* Add a new input `disk-cache-files` in `action.yml` to specify custom disk cache files.
* Update `config.js` to handle the new `disk-cache-files` input and override the `diskCache.files` array if provided.
* Update the documentation in `README.md` to include the new `disk-cache-files` input and provide examples of its usage.

---

For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/bazel-contrib/setup-bazel/issues/67?shareId=XXXX-XXXX-XXXX-XXXX).
2025-02-18 16:26:58 -08:00
14 changed files with 105638 additions and 103425 deletions

View file

@ -19,7 +19,7 @@ jobs:
- ubuntu
- windows
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
- uses: ./
- if: failure() && runner.debug == '1'
uses: mxschmitt/action-tmate@v3

View file

@ -15,8 +15,8 @@ jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
cache: npm
node-version-file: package.json

View file

@ -1 +1 @@
nodejs 24.14.0
nodejs 22.14.0

View file

@ -6,7 +6,7 @@ and provides an advanced fine-grained caching to improve workflows performance.
## Usage
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
# Avoid downloading Bazel every time.
bazelisk-cache: true
@ -39,7 +39,7 @@ Default `""`.
#### Install Bazelisk 1.x
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
bazelisk-version: 1.x
```
@ -47,7 +47,7 @@ Default `""`.
#### Install exact Bazelisk version
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
bazelisk-version: 1.19.0
```
@ -67,7 +67,7 @@ Default `""`.
#### Enable Bzlmod
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
bazelrc: common --enable_bzlmod
```
@ -75,7 +75,7 @@ Default `""`.
#### Add colors and timestamps
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
bazelrc: |
build --color=yes
@ -83,30 +83,6 @@ Default `""`.
```
</details>
### `cache-save`
Whether to save caches at the end of the workflow.
Set to `false` for pull requests to allow cache restoration without saving,
which prevents PRs from polluting the cache while still benefiting from it.
Default `true`.
<details>
<summary>Examples</summary>
#### Disable cache saving on pull requests
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
with:
bazelisk-cache: true
disk-cache: ${{ github.workflow }}
repository-cache: true
cache-save: ${{ github.event_name != 'pull_request' }}
```
</details>
### `disk-cache`
Enable [`disk_cache`][2] and store it on GitHub based on contents of `BUILD` files.
@ -121,7 +97,7 @@ Default `false`.
#### Share a single disk cache
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
disk-cache: true
```
@ -129,9 +105,30 @@ Default `false`.
#### Separate disk caches between workflows
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
disk-cache: ${{ github.workflow }}
disk-cache: ${{ github.workflow }}}
```
</details>
### `disk-cache-files`
Specify custom disk cache files.
Default `""`.
<details>
<summary>Examples</summary>
#### Override disk cache files
```yaml
- uses: bazel-contrib/setup-bazel@0.13.0
with:
disk-cache-files: |
**/BUILD.bazel
**/BUILD
custom/path/BUILD
```
</details>
@ -153,7 +150,7 @@ Default `false`.
#### Enable external repositories caches
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
external-cache: true
```
@ -161,7 +158,7 @@ Default `false`.
#### Cache NPM repositories based on `package-lock.json` contents
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
external-cache: |
manifest:
@ -171,7 +168,7 @@ Default `false`.
#### Do not cache Ruby on Windows
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
external-cache: |
manifest:
@ -191,20 +188,12 @@ Default `""`.
#### Authenticate via key
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
google-credentials: ${{ secrets.GOOGLE_CLOUD_KEY }}
```
</details>
### `module-root`
Bazel module root directory, where `MODULE.bazel` and `WORKSPACE` is found.
Change this value to the module root if it's not the repository root.
Default `"."`.
### `output-base`
Change Bazel output base directory.
@ -222,7 +211,7 @@ Default is one of the following:
#### Use `C` drive letter
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
output-base: C:/_bazel
```
@ -242,7 +231,7 @@ Default `false`.
#### Store a single repository cache
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
repository-cache: true
```
@ -250,19 +239,10 @@ Default `false`.
#### Store a repository cache from a custom location
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
- uses: bazel-contrib/setup-bazel@0.13.0
with:
repository-cache: examples/gem/WORKSPACE
```
#### Store a repository cache from a list of custom locations
```yaml
- uses: bazel-contrib/setup-bazel@0.18.0
with:
repository-cache: |
- MODULE.bazel
- requirements_locked.txt
```
</details>
## Migrating from [`bazelbuild/setup-bazelisk`][6]
@ -276,7 +256,6 @@ However, if you used a `bazel-version` input before, you will need to remove it
To build action, run the following command:
```sh
$ npm install
$ npm run build
```

View file

@ -13,10 +13,6 @@ inputs:
description: Extra contents to write to user .bazelrc
required: false
default: ""
cache-save:
description: Whether to save caches. Set to false for pull requests to allow restores but prevent saves.
required: false
default: "true"
cache-version:
description: Version of all caches
required: false
@ -25,6 +21,10 @@ inputs:
description: Cache actions outputs based on BUILD
required: false
default: "false"
disk-cache-files:
description: Custom disk cache files
required: false
default: ""
external-cache:
description: Cache external 10MB+ repositories based on MODULE.bazel/WORKSPACE
required: false
@ -33,10 +33,6 @@ inputs:
description: Google Cloud account key for remote cache
required: false
default: ""
module-root:
description: Bazel module root directory. Default is `.`
required: false
default: "."
output-base:
description: Bazel output base directory. Default is $HOME/.cache/bazel (POSIX) or D:/_bazel (Windows)
required: false
@ -54,4 +50,3 @@ runs:
using: node20
main: dist/main/index.js
post: dist/post/index.js
post-if: "!cancelled()"

View file

@ -5,9 +5,8 @@ const core = require('@actions/core')
const github = require('@actions/github')
const bazeliskVersion = core.getInput('bazelisk-version')
const cacheSave = core.getBooleanInput('cache-save')
const cacheVersion = core.getInput('cache-version')
const moduleRoot = core.getInput('module-root')
const externalCacheConfig = yaml.parse(core.getInput('external-cache'))
const homeDir = os.homedir()
const arch = os.arch()
@ -16,12 +15,7 @@ const platform = os.platform()
let bazelOutputBase = core.getInput('output-base')
if (!bazelOutputBase) {
if (platform === 'win32') {
// check if GITHUB_WORKSPACE starts with D:
if (process.env.GITHUB_WORKSPACE?.toLowerCase()?.startsWith('d:')) {
bazelOutputBase = 'D:/_bazel'
} else {
bazelOutputBase = `C:/_bazel`
}
bazelOutputBase = 'D:/_bazel'
} else {
bazelOutputBase = `${homeDir}/.bazel`
}
@ -46,33 +40,39 @@ switch (platform) {
break
}
const baseCacheKey = `setup-bazel-${cacheVersion}-${platform}-${arch}`
const baseCacheKey = `setup-bazel-${cacheVersion}-${platform}`
const bazelrc = core.getMultilineInput('bazelrc')
const diskCacheConfig = core.getInput('disk-cache')
const diskCacheEnabled = diskCacheConfig !== 'false'
let diskCacheName = 'disk'
if (diskCacheEnabled) {
// Before Bazel 6.3, providing --disk_cache to common is an error,
// with Bazel 6.3 and onwards, common accepts any legal Bazel option
// https://github.com/bazelbuild/bazel/issues/3054
bazelrc.push(`build --disk_cache=${bazelDisk}`)
bazelrc.push(`common --disk_cache=${bazelDisk}`)
if (diskCacheName !== 'true') {
diskCacheName = `${diskCacheName}-${diskCacheConfig}`
}
}
const repositoryCacheConfig = yaml.parse(core.getInput('repository-cache'))
const repositoryCacheEnabled = repositoryCacheConfig !== false
const diskCacheFilesConfig = core.getMultilineInput('disk-cache-files')
let diskCacheFiles = [
'**/BUILD.bazel',
'**/BUILD'
]
if (diskCacheFilesConfig.length > 0) {
diskCacheFiles = diskCacheFilesConfig
}
const repositoryCacheConfig = core.getInput('repository-cache')
const repositoryCacheEnabled = repositoryCacheConfig !== 'false'
let repositoryCacheFiles = [
`${moduleRoot}/MODULE.bazel`,
`${moduleRoot}/WORKSPACE.bazel`,
`${moduleRoot}/WORKSPACE.bzlmod`,
`${moduleRoot}/WORKSPACE`
'MODULE.bazel',
'WORKSPACE.bazel',
'WORKSPACE.bzlmod',
'WORKSPACE'
]
if (repositoryCacheEnabled) {
bazelrc.push(`common --repository_cache=${bazelRepository}`)
if (repositoryCacheConfig !== true) {
if (repositoryCacheConfig !== 'true') {
repositoryCacheFiles = Array(repositoryCacheConfig).flat()
}
}
@ -87,7 +87,6 @@ if (googleCredentials.length > 0 && !googleCredentialsSaved) {
core.saveState('google-credentials-path', googleCredentialsPath)
}
const externalCacheConfig = yaml.parse(core.getInput('external-cache'))
const bazelExternal = core.toPosixPath(`${bazelOutputBase}/external`)
const externalCache = {}
if (externalCacheConfig) {
@ -100,10 +99,10 @@ if (externalCacheConfig) {
externalCache.baseCacheKey = `${baseCacheKey}-external-`
externalCache.manifest = {
files: [
`${moduleRoot}/MODULE.bazel`,
`${moduleRoot}/WORKSPACE.bazel`,
`${moduleRoot}/WORKSPACE.bzlmod`,
`${moduleRoot}/WORKSPACE`
'MODULE.bazel',
'WORKSPACE.bazel',
'WORKSPACE.bzlmod',
'WORKSPACE'
],
name: `external-${manifestName}-manifest`,
path: `${os.tmpdir()}/external-cache-manifest.txt`
@ -111,10 +110,10 @@ if (externalCacheConfig) {
externalCache.default = {
enabled: true,
files: [
`${moduleRoot}/MODULE.bazel`,
`${moduleRoot}/WORKSPACE.bazel`,
`${moduleRoot}/WORKSPACE.bzlmod`,
`${moduleRoot}/WORKSPACE`
'MODULE.bazel',
'WORKSPACE.bazel',
'WORKSPACE.bzlmod',
'WORKSPACE'
],
name: (name) => { return `external-${name}` },
paths: (name) => {
@ -138,10 +137,9 @@ core.exportVariable('BAZELISK_GITHUB_TOKEN', token)
module.exports = {
baseCacheKey,
cacheSave,
bazeliskCache: {
enabled: core.getBooleanInput('bazelisk-cache'),
files: [`${moduleRoot}/.bazelversion`],
files: ['.bazelversion'],
name: 'bazelisk',
paths: [core.toPosixPath(`${userCacheDir}/bazelisk`)]
},
@ -151,8 +149,7 @@ module.exports = {
enabled: diskCacheEnabled,
files: [
...repositoryCacheFiles,
`${moduleRoot}/**/BUILD.bazel`,
`${moduleRoot}/**/BUILD`
...diskCacheFiles
],
name: diskCacheName,
paths: [bazelDisk]

105069
dist/main/index.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

102714
dist/post/index.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -96,11 +96,7 @@ async function downloadBazelisk() {
core.debug('Adding to the cache...');
fs.chmodSync(downloadPath, '755');
let bazel_name = "bazel";
if (platform == 'windows') {
bazel_name = `${bazel_name}.exe`
}
const cachePath = await tc.cacheFile(downloadPath, bazel_name, 'bazelisk', version)
const cachePath = await tc.cacheFile(downloadPath, 'bazel', 'bazelisk', version)
core.debug(`Successfully cached bazelisk to ${cachePath}`)
return cachePath
@ -133,16 +129,14 @@ async function restoreExternalCaches(cacheConfig) {
// Now restore all external caches defined in manifest
if (fs.existsSync(path)) {
const manifest = fs.readFileSync(path, { encoding: 'utf8' })
const restorePromises = manifest.split('\n').filter(s => s)
.map(name => {
return restoreCache({
enabled: cacheConfig[name]?.enabled ?? cacheConfig.default.enabled,
files: cacheConfig[name]?.files || cacheConfig.default.files,
name: cacheConfig.default.name(name),
paths: cacheConfig.default.paths(name)
});
});
await Promise.all(restorePromises);
for (const name of manifest.split('\n').filter(s => s)) {
await restoreCache({
enabled: cacheConfig[name]?.enabled ?? cacheConfig.default.enabled,
files: cacheConfig[name]?.files || cacheConfig.default.files,
name: cacheConfig.default.name(name),
paths: cacheConfig.default.paths(name)
})
}
}
}
@ -152,10 +146,9 @@ async function restoreCache(cacheConfig) {
}
const delay = Math.random() * 1000 // timeout <= 1 sec to reduce 429 errors
await setTimeout(delay)
await setTimeout(delay, async function () {
core.startGroup(`Restore cache for ${cacheConfig.name}`)
core.startGroup(`Restore cache for ${cacheConfig.name}`)
try {
const hash = await glob.hashFiles(cacheConfig.files.join('\n'))
const name = cacheConfig.name
const paths = cacheConfig.paths
@ -178,11 +171,9 @@ async function restoreCache(cacheConfig) {
} else {
core.info(`Failed to restore ${name} cache`)
}
} catch (err) {
core.warning(`Failed to restore ${name} cache with error: ${err}`)
} finally {
core.endGroup()
}
}())
}
run()

1045
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,10 @@
{
"name": "setup-bazel",
"version": "0.18.0",
"version": "0.13.0",
"description": "Install and configure Bazel for GitHub Actions",
"main": "index.js",
"engines": {
"node": "24.x"
"node": "22.x"
},
"scripts": {
"build": "ncc build index.js -s -o dist/main && ncc build post.js -s -o dist/post",
@ -13,11 +13,11 @@
"author": "Alex Rodionov <p0deje@gmail.com>",
"license": "MIT",
"dependencies": {
"@actions/cache": "^6.0.0",
"@actions/core": "^3.0.0",
"@actions/github": "^9.0.0",
"@actions/glob": "^0.6.0",
"@actions/tool-cache": "^4.0.0",
"@actions/cache": "^4.0.0",
"@actions/core": "^1.10.1",
"@actions/github": "^6.0.0",
"@actions/glob": "^0.5.0",
"@actions/tool-cache": "^2.0.1",
"@vercel/ncc": "^0.38.0",
"yaml": "^2.2.1"
}

View file

@ -13,11 +13,6 @@ async function run() {
}
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)