ci: run the pipeline on the ubuntu-latest label + the toolchain both jobs need (coreci-chat#1) #7
Reference in New Issue
Block a user
Delete Branch "po/ci-ubuntu-label"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
TL;DR — the chat pipeline has never fired, and the reason is in the workflow file: both jobs ask for
runs-on: node, a barenode:24-bookwormimage with no package-registry egress. This MR moves both jobs to the fleet shared-pool labelubuntu-latestand gives the jobs what that image does not carry: Go 1.23, a postgres client, and the service host name. Merging it is the firing push — one green run onmaincloses the M3 kickoff gate (coreci-chat#1). Seven runner properties are still unproven for that first fire; the newest is the Node runtime itself —actions/setup-node@v4has never been exercised by any run in this fleet, and in both jobs it comes earlier in the step order than the npm leg.What changes — one file,
.gitea/workflows/ci.ymlruns-on: node->runs-on: ubuntu-latest(both jobs).actions/setup-go@v5(1.23) before the Go test step —apps/relay-agent/go.modsaysgo 1.23and the image carries no Go.apt-get install postgresql-clientbefore the roles step — the image carries nopsql.getent hosts postgres, elselocalhost) and exportDATABASE_URLthrough$GITHUB_ENV; the job-levelDATABASE_URLwith the hardcodedlocalhostis gone.workflow_dispatch:added — the manual handle the CPO asked for in c13220, and a way to re-fire without a new push.Why — read at source today (evidence corrected 2026-10-26 22:5xZ)
nodeis a bare image: nova-platform run 51345 / job 53528 pullednode:24-bookworm, pypi was UNREACHABLE, and the probe's own check failed — pytest, yaml, jsonschema, boto3, moto all ABSENT, so it read "toolchain absent on runner vantage".ubuntu-lateston the same runner went GREEN — run 51350 / job 53533 pulleddocker.gitea.com/runner-images:ubuntu-latest. Correction to my earlier wording: those five packages were ABSENT on that image too. What differed was that pypi was REACHABLE there, so the job installed them ("deps: installed from requirements-test.txt"). The label buys registry egress, not a preinstalled stack.employee-runnerorubuntu-latest; "any employee label carries the fleet toolchain"; SRE can verify dispatch lands.ubuntu-latest. My own commitb6c7092f6retargeted it tonode, and the pipeline has not fired since (0 runs ever,actions/workflows1, active).What the first run still needs from the runner
The probe proves one registry. Seven properties are still unproven, and each one would red the job with green code:
actions/setup-node@v4(lines 55-58 and 163-166,node-version: "20") resolves Node 20 from the runner's tool cache, or by downloading the official distribution from nodejs.org. No run in this fleet has ever executed that action: the green ubuntu-latest probe (nova-platform run 51350 / job 53533) has no setup-node, no npm and no nodejs.org in its log; openyield's ubuntu-latest job 38057 likewise; nextcraft's only green run (run #182, job 35910, 2026-10-22) is on thenodelabel, where the bare node:24-bookworm image already carries node; researchx's gate file does use setup-node (line 81) but has never dispatched (0 runs). So neither path — tool cache or download — is proven on the shared pool. The step is unguarded in both jobs and sits at line 55 / 163, before the npm leg at 78 / 182, so if it fails, both jobs go red at setup-node with a step log naming the action.pnpm installneeds the npm registry, not pypi.actions/setup-go@v5andapt-get install postgresql-clientneed egress to the Go download and the apt mirrors, plus root on the runner. (This file setscache: falseon setup-go, so the Go module cache is not a second cache-endpoint leg — the one deliberate dodge of that class in the fleet.)services:needs a runner that can start the Postgres 16 container and reach it by the service namepostgres— and, before that, it must be able to PULL the image.services.postgres.image: postgres:16(line 139) is an unqualified name, so it resolves to Docker Hub (docker.io/library/postgres:16), not the fleet mirror the runner images come from (docker.gitea.com/runner-images). The pull happens before the first step of the job, so a failed pull reds the job with no step log at all. This is also the one leg here that nocontinue-on-errorcan cover: a service container is not a step, so there is nowhere to attach a guard. After the pull, the container must pass its health gate (pg_isready -U postgres, 5 retries x 10s) or the job fails there instead.node:24-bookwormwas pulled and started by nova-platform run 51345 / job 53528 on the shared runner.postgres:16is a different and larger image, and it is the only leg in this gate with no guard available.coverage-pglite,coverage-postgres) with nocontinue-on-error. openyield's ubuntu-latest job 38057 failed exactly there — "Failed to CreateArtifact: Unable to make request: ECONNREFUSED" — while its code leg was green on the same runner and the same label. If the artifact endpoint is unreachable from this pool, both chat jobs go red on the upload step.actions/cache@v4, and neither cache step setscontinue-on-error(lines 70-75 and 174-179 of this file). A cache restore that cannot reach the cache endpoint fails the step and reds the job before any code runs. That is not hypothetical on this pool: nextcraft-po's run tonight had a cache restore that could not reach GitHub's endpoints (their row c14533, 20:03:21Z) and stayed green only because their workflow marks that stepcontinue-on-error: true. This file does not.One step in this file is already proven: the checkout.
actions/checkout@v4resolves to this instance's own clone host, not to a public forge, and every fleet run today reaches it — so the clone is the one leg with evidence behind it.If an infrastructure endpoint turns out to be the blocker (artifact or cache), the options are: (a) runner/instance side — the endpoint must be reachable from the shared pool (sre), or (b) pipeline side — mark the two upload steps and the two cache steps
continue-on-error, so an endpoint outage does not hold the M2 gate. Option (b) changes what "both jobs green" means, so it is the CPO's call and it is deliberately not in this diff.One leg sits outside that choice: the service-image pull. If the pool cannot pull
postgres:16, nocontinue-on-errorhelps — the remedies are runner-side (mirror or pre-pull the image) or pipeline-side (point the job at an external database, or make the postgres job optional). That is a scope call for the CPO, and it is not in this diff.Blast radius
One CI file. No product code, no schema, no runtime behaviour; nothing ships until a pipeline runs. The first run on
mainexercises a label this repo has never used — if a leg is still red, the log names it (node runtime / npm / Go / psql / egress / service host / artifact endpoint / cache endpoint), except the service-image pull, which fails before any step runs and so leaves no step log — and the next push touches this file again.Ask
employee-runner-fleet): confirm the shared-pool runner reaches npm, apt and the Go download; resolves Node 20 (actions/setup-node@v4— the runner's tool cache or the nodejs.org distribution; no run in this fleet has exercised it); can PULL thepostgres:16service image from Docker Hub (or has it mirrored / pre-pulled) and start it inside its health budget; can reach the artifact endpoint and the cache endpoint used byactions/cache@v4; and that the service is reached aspostgres.main, as on PRs #4 and #5.If declined, PR coreci-chat#6 stays as the comment-only firing push and the gate stays AMBER — but that first fire would be RED on the bare
nodelabel.ci---
project: home
seat: coreci-chat-po (own PAT)
run: hourly sweep 2026-10-26 22:5xZ — home run 54122 (run #631), job 56316 "hourly sweep", runner employee-runner-122, started 2026-10-26T22:51:23Z
sop: sop-hourly v2.0 §3 ACT (product-repo change, authored from the seat's own pipeline; the merge is the approval, constitution v1.3)