mirror of
https://github.com/navidrome/navidrome.git
synced 2026-08-31 07:30:32 +00:00
ci: cache the plugins test suite WASM compilation across runs (#6049)
* ci: cache the plugins test suite WASM compilation across runs The 'Test Go code' job was dominated by a single package: 'plugins' took 541s of the 699s test step. The suite builds 25 test plugins as full-Go wasip1 modules of ~4.5MB each, and wazero must compile every one to machine code. Under -race that compiler work is instrumented, so each module costs around 11 seconds. The suite already shared a wazero compilation cache, but three things kept it from paying off. It lived in a fresh temp dir, so nothing survived the run. The default plugins.cachesize of 200MB was smaller than the 334MB the cache actually needs, so the purge evicted entries mid-run. And the wasm binaries embedded VCS stamps, so every commit produced different bytes and missed the content-addressed cache anyway. Point CacheFolder at plugins/testdata/.wazero-cache, raise the test cache limit past what the suite needs, build the test plugins with -buildvcs=false, and restore the directory in CI. Locally the package goes from 256s to 74s with the cache warm and the wasm rebuilt from scratch. * ci: key the WASM cache on what actually changes the modules The test plugins are separate Go modules with their own go.mod and go.sum; they reach the PDK through a replace directive and never read the root module. So the root go.sum has no bearing on the wasm bytes, and the wazero version it pins is already namespaced by wazero itself, which stores entries under wazero-<version>-<goarch>-<goos>. Keying on it only rotated the cache on every unrelated dependency bump. Drop it, and add the go.mod files that were missing: the test plugins' own and the PDK's. The root go.mod stays, since it selects the toolchain that builds the modules. * ci: key the WASM cache on the toolchain version, not go.mod Only the Go toolchain in the root go.mod affects the built wasm, but the file also changes on every direct dependency bump, which would rotate the cache for no reason. Take setup-go's go-version output instead: it is the version that actually built the modules.
This commit is contained in:
parent
aee8a705b1
commit
46041bb908
10
.github/workflows/pipeline.yml
vendored
10
.github/workflows/pipeline.yml
vendored
@ -131,12 +131,22 @@ jobs:
|
||||
uses: actions/checkout@v7
|
||||
|
||||
- uses: actions/setup-go@v6
|
||||
id: setup-go
|
||||
with:
|
||||
go-version-file: go.mod
|
||||
|
||||
- name: Download dependencies
|
||||
run: go mod download
|
||||
|
||||
# Without this, the plugins suite recompiles every test plugin WASM module,
|
||||
# which dominates the job runtime under -race.
|
||||
- name: Cache the plugins test suite WASM compilation cache
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: plugins/testdata/.wazero-cache
|
||||
key: wazero-${{ runner.os }}-go${{ steps.setup-go.outputs.go-version }}-${{ hashFiles('plugins/testdata/*/*.go', 'plugins/testdata/*/go.*', 'plugins/pdk/go/**/*.go', 'plugins/pdk/go/go.*') }}
|
||||
restore-keys: wazero-${{ runner.os }}-
|
||||
|
||||
- name: Test
|
||||
run: go test -shuffle=on -tags netgo,sqlite_fts5 -race ./... -v
|
||||
|
||||
|
||||
5
.gitignore
vendored
5
.gitignore
vendored
@ -43,4 +43,7 @@ go.work*
|
||||
.playwright-mcp/
|
||||
|
||||
# Temp benchmark files
|
||||
zz_*_test.go
|
||||
zz_*_test.go
|
||||
|
||||
# wazero compilation cache for the plugins test suite
|
||||
/plugins/testdata/.wazero-cache/
|
||||
|
||||
@ -25,7 +25,10 @@ import (
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
const testDataDir = "plugins/testdata"
|
||||
const (
|
||||
testDataDir = "plugins/testdata"
|
||||
wazeroCacheDir = ".wazero-cache"
|
||||
)
|
||||
|
||||
// Shared test state initialized in BeforeSuite
|
||||
var (
|
||||
@ -38,18 +41,10 @@ func TestPlugins(t *testing.T) {
|
||||
tests.Init(t, false)
|
||||
buildTestPlugins(t, testDataDir)
|
||||
|
||||
// Create a shared wazero compilation cache directory.
|
||||
// All test managers will point CacheFolder here so that WASM compilation
|
||||
// is done once per binary and then reused from disk cache.
|
||||
sharedCacheDir, err := os.MkdirTemp("", "plugins-shared-cache-*")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create shared cache dir: %v", err)
|
||||
}
|
||||
t.Cleanup(func() { os.RemoveAll(sharedCacheDir) })
|
||||
|
||||
// Set CacheFolder globally so all tests (including those using
|
||||
// configtest.SetupConfig) inherit it without needing to set it manually.
|
||||
conf.Server.CacheFolder = conf.NewDir(sharedCacheDir)
|
||||
// Set globally so tests using configtest.SetupConfig inherit it. The cache
|
||||
// persists between runs; entries are content-addressed, so a stale one only misses.
|
||||
conf.Server.CacheFolder = conf.NewDir(filepath.Join(testDataDir, wazeroCacheDir))
|
||||
conf.Server.Plugins.CacheSize = "1GB" // the default evicts the cache mid-run
|
||||
|
||||
log.SetLevel(log.LevelFatal)
|
||||
RegisterFailHandler(Fail)
|
||||
|
||||
6
plugins/testdata/Makefile
vendored
6
plugins/testdata/Makefile
vendored
@ -10,6 +10,7 @@ all: $(PLUGINS:%=%.ndp)
|
||||
|
||||
clean:
|
||||
rm -f $(PLUGINS:%=%.ndp) $(PLUGINS:%=%.wasm)
|
||||
rm -rf .wazero-cache
|
||||
|
||||
# PDK source files that trigger rebuild when changed (recursive)
|
||||
PDK_SOURCES := $(shell find ../pdk/go -name '*.go' 2>/dev/null)
|
||||
@ -22,10 +23,11 @@ PDK_SOURCES := $(shell find ../pdk/go -name '*.go' 2>/dev/null)
|
||||
@rm -f plugin.wasm
|
||||
@mv $< $<.tmp && mv $<.tmp $< # Touch wasm to ensure it's older than ndp
|
||||
|
||||
# Build the wasm binary
|
||||
# Build the wasm binary. -buildvcs=false keeps the bytes stable across commits, so
|
||||
# the test suite's wazero compilation cache still hits after a rebuild.
|
||||
%.wasm: %/*.go %/go.mod $(PDK_SOURCES)
|
||||
ifdef TINYGO
|
||||
cd $* && tinygo build -target wasip1 -buildmode=c-shared -o ../$@ .
|
||||
else
|
||||
cd $* && GOOS=wasip1 GOARCH=wasm go build -buildmode=c-shared -o ../$@ .
|
||||
cd $* && GOOS=wasip1 GOARCH=wasm go build -buildvcs=false -buildmode=c-shared -o ../$@ .
|
||||
endif
|
||||
Loading…
x
Reference in New Issue
Block a user