Before: since Gitea 28.3.0, every matrix job on these runners dies before its first step: Unknown Property job-index … job-total … the workflow file is not usable. That stopped zegit's v0.1.52 image build (image-gitea.yml run 23992).
After: the image carries a runner that accepts those two fields and ignores them. Everything else in the image is unchanged.
How. Gitea 28 adds job-index and job-total under strategy in the single-job workflow it sends the runner. No forgejo-runner release accepts them (schema checked in 12.11.1, 12.13.2, 13.2.1). A new build stage takes upstream v12.11.1 at commit 8e01d43c, applies patches/0001-*.patch, runs the patch's two tests, builds a static binary and copies it over the stock /bin/forgejo-runner. The patch touches act/schema/workflow_schema.json only (10 lines), plus tests and a test fixture (the real rejected payload from job 52616). The Go builder and the runner base are now pinned by digest.
Assumptions & Decisions
The final image still starts FROM the stock runner 12.11.1 so the toolchain layers are the same as ci9; only the binary is replaced.
The binary still reports v12.11.1, so Gitea sees the same version as before.
Markus chose the patched runner over removing the matrix, and no local proof: the ci10 rollout is the live test. A fallback that removes the matrix stays on a local zegit branch.
Base digests are the index digests of data.forgejo.org/oci/golang:1.25-alpine3.23 and code.forgejo.org/forgejo/runner:12.11.1 as of 2026-11-08.
How it was tested
TestGenerateWorkflow_Gitea28MatrixJob feeds the real 591-line payload through generateWorkflow: red without the patch with the exact production error, green with it. Its matrix expands to image: z-gateway-server.
go test -short on act/schema, act/model, act/jobparser and internal/... passes on the patched tree.
docker buildx build --platform linux/amd64 of this Dockerfile succeeds; the binary reports forgejo-runner version v12.11.1.
Not tested: the arm64 build (the workflow builds both), and a real matrix job against Gitea 28, which is the rollout.
After merge (operator)
Run build image (gitea) (build-image-gitea.yml) on master with tag=12.11.1-ci10, sign_only=false.
Bump zegit-forgejo-runner to 12.11.1-ci10@<digest> in flux-config, on deployment-zegit-runner.yaml lines 104 and 150, and deployment-forgejo-runner.yaml lines 49 and 91 (it uses the same image).
<!-- claude-projects-attribution: {"github_login":"AtomicBackspace"} -->
_Requested by **Markus** · [project thread](https://claude.ai/code/project/chan_01VZVzJf1ggm8Ck9zzkXBenz?thread=cmsg_01VZVzJf1ggm8Ck9zzkXBenzTss2Yj7N5tPHMif39Zt6dR)_
Before: since Gitea 28.3.0, every matrix job on these runners dies before its first step: `Unknown Property job-index … job-total … the workflow file is not usable`. That stopped zegit's v0.1.52 image build (image-gitea.yml run 23992).
After: the image carries a runner that accepts those two fields and ignores them. Everything else in the image is unchanged.
**How.** Gitea 28 adds `job-index` and `job-total` under `strategy` in the single-job workflow it sends the runner. No forgejo-runner release accepts them (schema checked in 12.11.1, 12.13.2, 13.2.1). A new build stage takes upstream v12.11.1 at commit 8e01d43c, applies `patches/0001-*.patch`, runs the patch's two tests, builds a static binary and copies it over the stock `/bin/forgejo-runner`. The patch touches `act/schema/workflow_schema.json` only (10 lines), plus tests and a test fixture (the real rejected payload from job 52616). The Go builder and the runner base are now pinned by digest.
## Assumptions & Decisions
- The final image still starts `FROM` the stock runner 12.11.1 so the toolchain layers are the same as ci9; only the binary is replaced.
- The binary still reports `v12.11.1`, so Gitea sees the same version as before.
- Markus chose the patched runner over removing the matrix, and no local proof: the ci10 rollout is the live test. A fallback that removes the matrix stays on a local zegit branch.
- Base digests are the index digests of `data.forgejo.org/oci/golang:1.25-alpine3.23` and `code.forgejo.org/forgejo/runner:12.11.1` as of 2026-11-08.
## How it was tested
- `TestGenerateWorkflow_Gitea28MatrixJob` feeds the real 591-line payload through `generateWorkflow`: red without the patch with the exact production error, green with it. Its matrix expands to `image: z-gateway-server`.
- `go test -short` on `act/schema`, `act/model`, `act/jobparser` and `internal/...` passes on the patched tree.
- `docker buildx build --platform linux/amd64` of this Dockerfile succeeds; the binary reports `forgejo-runner version v12.11.1`.
- **Not tested:** the arm64 build (the workflow builds both), and a real matrix job against Gitea 28, which is the rollout.
## After merge (operator)
1. Run **build image (gitea)** (`build-image-gitea.yml`) on master with `tag=12.11.1-ci10`, `sign_only=false`.
2. Bump `zegit-forgejo-runner` to `12.11.1-ci10@<digest>` in flux-config, on `deployment-zegit-runner.yaml` lines 104 and 150, and `deployment-forgejo-runner.yaml` lines 49 and 91 (it uses the same image).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Gitea 28 adds job-index and job-total under strategy in the workflow it
sends for a matrix job, and forgejo-runner's schema refuses them, so
every matrix job dies before its first step (zegit image-gitea.yml run
23992, the v0.1.52 tag build). No forgejo-runner release accepts them
(checked through 13.2.1). Build the runner from v12.11.1 at its commit
with a one-file schema patch and two tests, one of them the real payload
of that failed job; the build runs them. Bases are pinned by digest.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_018wWyCiV27KmNSauYTdLyp7
markus
marked the pull request as ready for review 2026-11-08 10:33:26 +00:00
markus
merged commit 3718556e29 into master2026-11-08 10:33:30 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Requested by Markus · project thread
Before: since Gitea 28.3.0, every matrix job on these runners dies before its first step:
Unknown Property job-index … job-total … the workflow file is not usable. That stopped zegit's v0.1.52 image build (image-gitea.yml run 23992).After: the image carries a runner that accepts those two fields and ignores them. Everything else in the image is unchanged.
How. Gitea 28 adds
job-indexandjob-totalunderstrategyin the single-job workflow it sends the runner. No forgejo-runner release accepts them (schema checked in 12.11.1, 12.13.2, 13.2.1). A new build stage takes upstream v12.11.1 at commit 8e01d43c, appliespatches/0001-*.patch, runs the patch's two tests, builds a static binary and copies it over the stock/bin/forgejo-runner. The patch touchesact/schema/workflow_schema.jsononly (10 lines), plus tests and a test fixture (the real rejected payload from job 52616). The Go builder and the runner base are now pinned by digest.Assumptions & Decisions
FROMthe stock runner 12.11.1 so the toolchain layers are the same as ci9; only the binary is replaced.v12.11.1, so Gitea sees the same version as before.data.forgejo.org/oci/golang:1.25-alpine3.23andcode.forgejo.org/forgejo/runner:12.11.1as of 2026-11-08.How it was tested
TestGenerateWorkflow_Gitea28MatrixJobfeeds the real 591-line payload throughgenerateWorkflow: red without the patch with the exact production error, green with it. Its matrix expands toimage: z-gateway-server.go test -shortonact/schema,act/model,act/jobparserandinternal/...passes on the patched tree.docker buildx build --platform linux/amd64of this Dockerfile succeeds; the binary reportsforgejo-runner version v12.11.1.After merge (operator)
build-image-gitea.yml) on master withtag=12.11.1-ci10,sign_only=false.zegit-forgejo-runnerto12.11.1-ci10@<digest>in flux-config, ondeployment-zegit-runner.yamllines 104 and 150, anddeployment-forgejo-runner.yamllines 49 and 91 (it uses the same image).🤖 Generated with Claude Code