evcc-io/.github/actions/docker-cache/action.yml

45 lines
1.7 KiB
YAML

name: Docker build cache
description: >
Restores the Dockerfile's Go and npm cache mounts and persists them afterwards.
BuildKit cache mounts live in the builder daemon and are not covered by any
cache exporter, so they have to be injected and extracted explicitly. Requires
Buildx to be set up and must run before the build.
inputs:
builder:
description: Buildx builder name
required: true
cache-scope:
description: >
Cache namespace, mirroring build-toolchain. "main" (default) writes the
shared cache. Untrusted callers (e.g. PR builds) should pass a different
value such as "pr": writes stay isolated so they cannot poison the shared
cache, while reads still fall back to it.
default: main
runs:
using: composite
steps:
# Rotates with the dependency set. Source changes keep using the existing
# cache, which still covers the third-party packages dominating the build.
- name: Cache mount contents
id: cache
uses: actions/cache@v6
with:
path: .docker-cache
key: ${{ runner.os }}-docker-mounts-${{ inputs.cache-scope }}-${{ hashFiles('go.sum', 'package-lock.json') }}
restore-keys: |
${{ runner.os }}-docker-mounts-${{ inputs.cache-scope }}-
${{ runner.os }}-docker-mounts-main-
- name: Inject cache mounts
uses: reproducible-containers/buildkit-cache-dance@5422eac04292c961a382e0f584ea0f03ad9da723 # v3.4.0
with:
builder: ${{ inputs.builder }}
cache-map: |
{
".docker-cache/go-build": "/root/.cache/go-build",
".docker-cache/go-mod": "/root/.cache/go-mod",
".docker-cache/npm": "/root/.npm"
}
skip-extraction: ${{ steps.cache.outputs.cache-hit }}