mirror of
https://github.com/navidrome/navidrome.git
synced 2026-10-18 07:30:29 +00:00
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.
33 lines
1.2 KiB
Makefile
33 lines
1.2 KiB
Makefile
# Build test plugins used for integration testing
|
|
# Auto-discover all plugin folders (folders containing go.mod)
|
|
PLUGINS := $(patsubst %/go.mod,%,$(wildcard */go.mod))
|
|
|
|
# Prefer tinygo if available, it produces smaller wasm binaries and
|
|
# makes the tests faster.
|
|
TINYGO := $(shell command -v tinygo 2> /dev/null)
|
|
|
|
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)
|
|
|
|
# Build the .ndp package (zip containing manifest.json + plugin.wasm)
|
|
%.ndp: %.wasm %/manifest.json
|
|
@rm -f $@
|
|
@cp $< plugin.wasm
|
|
zip -j $@ $*/manifest.json plugin.wasm
|
|
@rm -f plugin.wasm
|
|
@mv $< $<.tmp && mv $<.tmp $< # Touch wasm to ensure it's older than ndp
|
|
|
|
# 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 -buildvcs=false -buildmode=c-shared -o ../$@ .
|
|
endif |