ci: publish this build's own coverage and benchmarks Serving a revision is two passes over the whole corpus — FromDocuments builds the archive, LinkPass renders every document to fill the link graph — and a proposal view is a third over two whole revisions. All three grow with the space rather than with the request, and this repository had no Benchmark at all; doc/ and prosediff/ now measure them over a synthetic 208-document space and a 24-chapter specification carrying one of every change kind. The manifest gains a coverage and a bench task, both after publish so a rejected upload cannot cost a shipped apk, and both guarded: the profile must be non-empty, the benchmark names must be in the file (an empty benchfmt body uploads and reports success), and a build handed no token says so and exits 0 with the artifact still attached.
ci: publish the apk into artifacts.sr.ht as well The abuild output goes on to the S3 bucket phoebe re-indexes, and now also to the ~bigbes/main channel of artifacts.sr.ht, which indexes and signs it in the same request. One PUT per file with the shared working token; a 409 says the job ran twice and is a warning rather than a failure.
ci: run the suites against a real Postgres on the builder 93 test files across 16 packages had never run on builds.sr.ht. The manifest brings up a Postgres in the VM, exports SPECSRHT_TEST_PG and runs gofmt, go vet and `make test` before abuild. The DSN guard is the point of it. db/db_test.go, service/fixture_test.go and cmd/specsrht-migrate/main_test.go all gate on that variable, so an unset DSN does not fail anything — it skips 67 tests (counted, with and against a local Postgres) and leaves the build green over the whole persistence layer, the schema/migrations agreement check included. options="!check" in the APKBUILD means this task is the only place the suites run at all, so the guard is what makes that line true. TEST_TIMEOUT lands with it rather than after the first goroutine dump: the toolchain's default is a silent ten minutes.
ci: export the version instead of sed-ing a tracked APKBUILD The version reaches abuild as $PKGVER now, and the tracked APKBUILD is never rewritten: Go reads vcs.modified from `git status --porcelain`, so a sed of a tracked file stamps every packaged binary dirty for the whole abuild run. The export alone would not have fixed it. .gitignore covered the intermediate web/static/main.css and not the content-hashed main.min.<sha>.css that `make css` renames it to — the file that survives, and that build() writes BEFORE go build — so every packaging run compiled with an untracked file in the tree. /src/, /pkg/ and /tmp/ are the three directories abuild works in inside this checkout, GOTMPDIR among them. Also: the cacher bootstrap splits into install + init so the installer's PATH export is sourced by the next task, and goes through install.sh for its checksum verification; scss collapses into the --exec miss-and-seed form; cache_restore takes --optional plus the half-restored module cache repair; cache_save moves after publish and drops the exists-guards; publish gates on a readable ~/.apk-ci.env; tags build. package() stages what build() produced (make install-files) instead of recompiling both binaries in a fresh fakeroot process with no cache pins, and stops installing static assets that //go:embed already put in the binary. The `[ -d ./cmd/... ]` skip guards are gone: a deleted cmd/ was a green build that packaged nothing. The reasoning lives in docs/ci.md, because the manifest is a varchar(16384) and a submission over the cap gets no CI at all.
ci: cache the assembled scss tree Move the cacher bootstrap to the first task and assemble the shared sourcehut scss partials in ~/scss behind a cache keyed by CORE_VER+BOOTSTRAP_REV. On a hit the build no longer talks to git.sr.ht or github.com at all, so their outages can't fail it; a pin bump misses and reassembles from source as before.
ci: cache Go module and build dirs via cacher Same scheme as sr-ht-dolt (dbd8638 there): restore ~/go/pkg/mod and ~/.cache/go-build from the Garage docker-cache bucket before abuild and seed them back after, keyed by go.sum via cacher (go.bigb.es/cacher). GOCACHE/GOMODCACHE are re-pinned inside build() because abuild redirects them into its throwaway $tmpdir and an upstream typo in abuild.in clobbers any pre-set GOMODCACHE with GOCACHE's value.
ci(apk): build CSS against core 0.84.5 Tracks the srht deployment's SRHT_CORE_VER bump (unified project nav added scss/nav.scss and reworked dark.scss). BOOTSTRAP_REV unchanged — the bootstrap submodule did not move between 0.83.8 and 0.84.5.
build: package spec.sr.ht as an apk and wire push->build->mirror Deploy the service from our own apk repo instead of cloning and compiling this tree inside the srht stack's Dockerfile. - APKBUILD: build css then static binaries (CGO_ENABLED=0), install under ASSETS=/usr/share/sourcehut so specsrht-migrate resolves schema and migrations at the real runtime path. pkgver rewritten by CI to 0.0.<commit-count> for a monotonic, pinnable version. - .build.yml: builds.sr.ht manifest — assemble the shared sourcehut scss partials (core.sr.ht CORE_VER + pinned Bootstrap submodule), throwaway per-build signing key, abuild, publish *.apk to the Garage repo bucket (append-only; apk-mirror on phoebe re-indexes and signs). - .sourcecraft/webhooks.yaml: push webhook to the phoebe gitsync service so the git.srht.bigb.es mirror updates in seconds, which is what makes the push -> apk build fire immediately.