The purpose-prefixed labels (hanzo-build-*, hanzo-deploy-*, hanzo-docs-build-*)
are retired in favour of the bare <os>-<arch> every runner already advertises.
They were not a capability, only a habit, and the habit cost builds: papers asked
for hanzo-build-linux-amd64, no online runner offered it, and two idle
linux-amd64 runners sat beside the queue while the build simply never ran. The
lux tree lost three days to lux-linux-amd64 the same way.
What a job is FOR is the workflow's name. runs-on is the machine it needs.
Co-authored-by: Hanzo Dev <[email protected]>
First real runs on this fleet turned up three things the workflows had been
getting for free from GitHub's hosted image.
golangci-lint had no setup-go step. The linter shells out to `go` to load
packages, and the job image does not carry a toolchain on PATH, so it exited on
"go command required, not found" without reading a file. It sets up Go from
go.mod now, like every other job here.
doctests ran setup-go before checkout, so go.mod was not on disk when the action
looked for it and the module cache degraded to a permanent miss. Checkout goes
first.
The e2e proxy builder was pinned to golang:1.24-alpine while go.mod requires
1.26.4. The official golang images set GOTOOLCHAIN=local, which makes the image
the authority and refuses a newer directive, so `go mod download` stopped the
compose build and took both docker.start and docker.e2e.start with it. The base
moves up to 1.26-alpine; the version stays declared in exactly one place, go.mod,
with the image as its floor.
govulncheck is reporting three standard-library advisories against this module.
That is a real finding and it stays visible.
Every leg of test-redis-ce brings up a real Redis container, so a red leg can
mean the environment rather than the code. workflow_dispatch makes confirming
which one a button instead of an empty commit.
The runner labels here were already right, but the files sat in
.github/workflows, the second entry in WORKFLOW_DIRS. Second is only read while
the first is absent, so every one of them was one .hanzo/workflows commit from
going silent. Six move across; four do not.
Moved: build.yml, doctests.yaml, golangci-lint.yml, govulncheck.yml,
spellcheck.yml, test-e2e.yml. The runners carry a docker daemon, so the
compose-backed suites (make docker.start, make docker.e2e.start) and the
`services:` block in doctests work as written. .github/actions/run-tests stays
where it is -- it is a composite action, not a workflow, and the `./` path
resolves from the repo root regardless of which directory the caller lives in.
Two adjustments inside the files that moved:
build.yml drops the benchmark job and samples the matrix at three Redis
versions instead of five. `make bench` measures without comparing to a
baseline, so it produced no pass/fail signal for thirty runner-slots per push
on a pool every org shares. What the sampling gives up is a break specific to
Redis 8.6 or 8.2, or to the 1.25.x pin now covered by oldstable/stable. The
Codecov upload goes with it: CODECOV_TOKEN is not a secret this forge holds,
so coverage is produced and no longer reported to a dashboard.
govulncheck.yml asked setup-go for "1.26.4.x", which is not a version it can
resolve. It reads go.mod now, which is where the toolchain version is already
decided.
Dropped, with what each cost:
codeql-analysis.yml uploaded SARIF to GitHub code scanning. There is no
such service here, and govulncheck covers the
vulnerability half against the Go advisory database.
release-drafter.yml assembled GitHub Release drafts from merged pull
requests. Release notes are written by hand.
Its .github/release-drafter-config.yml goes too;
nothing else reads it.
stale-issues.yml aged out issues and pull requests through the GitHub
issues API. Triage is manual.
test-redis-enterprise.yml needed the licensed redislabs/redis Enterprise
image and a clone of RedisLabs/redis-ee-docker. It was
already `if: false` upstream, so it gated nothing;
Redis Enterprise remains untested by CI.
The tree carried two compose files. Docker Compose v2 resolves by a fixed
precedence -- compose.yaml, compose.yml, docker-compose.yaml,
docker-compose.yml -- so compose.yml won every time and docker-compose.yml,
the one upstream merges actually keep current, was never read:
warning Found multiple config files with supported names:
.../compose.yml, .../docker-compose.yml
warning Using /Users/z/work/hanzo/kv-go/compose.yml
compose.yml was a 106-line snapshot taken before several upstream updates.
It pinned CLIENT_LIBS_TEST_IMAGE at 8.4.0 while the Makefile asks for 8.8.0,
and it was missing three services and a whole profile. Two things were
therefore broken and quiet about it:
* `make docker.e2e.start` runs `docker compose --profile e2e up`. There is
no e2e profile in the stale file, so it started nothing;
.github/workflows/test-e2e.yml then sat waiting for cae-resp-proxy on
:18100 until the timeout.
* `make docker.start` (--profile all) never started osscluster-tls, so
tls_cluster_test.go -- whose own comment says the ports come from the
compose file -- had no server on 5430.
Deleting the stale copy and giving the live one the canonical name (this
workspace uses compose.yml, never docker-compose.yml) leaves exactly one
compose file. `docker compose --profile e2e config --services` now returns
redis, cae-resp-proxy and proxy-fault-injector; --profile all also brings up
osscluster-tls. The three comments that named the old path now name the new
one. go build ./... clean.
Co-authored-by: Hanzo Dev <[email protected]>
Update module path from github.com/redis/go-redis/v9 to
github.com/hanzoai/kv-go/v9 for use as the Hanzo KV Go SDK.
- Update go.mod module declaration
- Update all Go imports across 260 files
- Update all submodule go.mod files (extra/*, example/*, internal/customvet)