The existing CI architecture doc assumes the reader already knows the
GitHub Actions terminology and can parse check-run labels like
'CI-maketest / builds (testgalera)'. A maintainer asked what that label
means and where to find it by grep, and the only answer was "re-read the
whole doc and work it out yourself, most of the pieces are in different
sections". That's not good enough.
This commit adds a new §12 'Understanding GitHub Actions vocabulary' that:
- Walks through the seven core terms (workflow, workflow run, job,
matrix cell, step, check run, caller/reusable split) bottom-up, using
ci-maketest.yml as a single concrete example throughout.
- Includes an ASCII nesting diagram that shows how workflow -> run ->
job -> matrix cell -> steps slot into each other, with check runs
as separate objects attached to the commit SHA.
- Includes a second ASCII diagram showing the ProxySQL two-branch
caller/reusable split: one logical trigger -> two workflow runs,
one on v3.0 and one on GH-Actions, sharing the same workflow name.
- Includes a third diagram tracing exactly how the check-run label
'CI-maketest / builds (testgalera)' is assembled at runtime from
github.workflow + github.job + env.MATRIX, explaining why the literal
string exists nowhere on disk and grepping for it or for 'galera'
will fail.
- Answers five common confusion questions directly (why click-throughs
land on GH-Actions, why two check rows per cell, where 'make
testgalera' is defined, which file produced a given check row,
CI-legacy-g2-genai vs CI-legacy-g2).
- Ends with a five-question self-test so the reader can check they have
the model right before closing the section.
Also:
- Added a 'New to GitHub Actions terminology?' pointer at the top of
the doc so a confused reader jumps directly to the new section
instead of wading through the two-branch architecture explanation
first.
- Renamed the existing compact Glossary table to 'Glossary (quick
reference)' to make clear it is the lookup-by-term reference and
the new narrative section is the learn-by-walkthrough explanation.
- Both sections are kept: §12 for people who need the model, §13 for
people who just need a word defined quickly.
No source-code or workflow changes. Doc only.
Three independent pieces, concatenated by one action call, at runtime.
**The full string never appears in the codebase.** This is why grepping
for "CI-maketest / builds (testgalera)" or even just "galera" in the
workflow directory of the v3.0 branch finds nothing useful:
- The string "galera" appears in **one** workflow file: `ci-maketest.yml`,
and *that file is on the `GH-Actions` branch, not `v3.0`*. If you
grepped only your local `v3.0` checkout, you missed it entirely.
- Even on `GH-Actions`, "galera" is not the file's name, not the job's
name, not the workflow's name — it is *one of six values inside one
`matrix.target` array*.
- The other place "galera" appears in the repo is in the root `Makefile`,
where `testgalera:` is a Make target that compiles proxysql + TAP tests
with `-DTEST_GALERA` defined. Grepping `Makefile` on `v3.0` for
`testgalera`*does* find it, but that hit tells you what the Make target
does, not what the workflow does.
### 12.5 Common confusions, answered directly
**Q: "I see `CI-maketest` in the Actions tab, but when I click the run,
the page URL says `/actions/runs/...` on the `GH-Actions` branch. Is that
a bug?"**
No. Because the caller on `v3.0` delegates via `uses:`, a single logical
trigger creates *two* workflow runs — one on each branch. Click-throughs
land wherever the particular link pointed. The caller run on `v3.0` is
always almost-empty (just the delegation); the meaty one is on
`GH-Actions`.
**Q: "Why are there two rows in my Checks tab for the same test — e.g.
`CI-maketest / builds (testgalera)` AND a plain `builds (testgalera)`?"**
Because `LouisBrunner/checks-action` creates its own custom-named check
run in addition to whatever GitHub auto-generates for the matrix cell.
Both attach to the same commit and describe the same execution. If they
disagree in status it usually means the post-job LouisBrunner call failed
(e.g. permissions), not that the job result differs.
**Q: "I want to know what `make testgalera` actually tests. Where do I
look?"**
Not in `.github/workflows/`. Look at the root `Makefile` on `v3.0`,
search for `^testgalera:`. You will find (lines ~203-206):
```make
testgalera: build_src_testgalera
cd test/tap && OPTZ="-O0 -ggdb -DDEBUG -DTEST_GALERA" make
cd test/tap/tests && OPTZ="-O0 -ggdb -DDEBUG -DTEST_GALERA" make
```
That tells you: it's a **build target** that compiles proxysql and the TAP
tests with `-DTEST_GALERA` defined. The `CI-maketest` workflow is a
**compile-check matrix** — it verifies the proxysql source still compiles
for each of 6 build flavors (testaurora, testgalera, …). It does **not**
run Galera tests against a Galera cluster. That's what the job being
named `builds` (not `tests`) is telling you.
**Q: "If the check-run label is assembled at runtime, how do I search
for 'which workflow file produced check X'?"**
Use this decision table:
| Check row on PR | What file produced it |
|---|---|
| `CI-foo` (no trailing `/ ...`) | Either the auto-generated top-level check of the caller run `CI-foo.yml@v3.0`, or the top-level rollup of the reusable `ci-foo.yml@GH-Actions`. Usually clicking the row tells you which. |
| `CI-foo / jobname` | The job `jobname` inside `ci-foo.yml` on `GH-Actions`. Read the `jobs.jobname:` block there. |
| `CI-foo / jobname (matrixvalue)` | A matrix cell of that job. Read the `jobs.jobname.strategy.matrix:` block — `matrixvalue` will appear as one of the values. |
**Rule of thumb: if you see a check name with a workflow prefix
(`CI-foo / ...`), the interesting file is always on `GH-Actions`, never
on `v3.0`.** The `v3.0` caller is always a 20-line stub; the matrix,
steps, and logic are in the reusable on `GH-Actions`.
**Q: "Where is `CI-legacy-g2-genai` defined? Is it a group, a flavor, a
matrix cell, a workflow?"**
It is a whole separate **workflow** pair — one caller (`CI-legacy-g2-genai.yml@v3.0`)
and one reusable (`ci-legacy-g2-genai.yml@GH-Actions`). Same pattern as
`CI-legacy-g2.yml` / `ci-legacy-g2.yml`, but for the GenAI-with-coverage
build flavor. So "there are 6 CI-legacy-g* workflows on v3.0"
(`g1, g2, g2-genai, g3, g4, g5`) and each is its own file, not a matrix
cell of a shared workflow. Contrast with `CI-maketest`, where the 6
build flavors ARE matrix cells of one shared workflow. Both patterns
exist in the repo for historical reasons.
### 12.6 Sanity-check yourself
If you understand the vocabulary, you should be able to answer each of
these in one sentence. Answers after each question.
1. **"How many workflows does `CI-maketest` have?"**
→ Two files on disk: `CI-maketest.yml` on v3.0 (caller stub) and
`ci-maketest.yml` on GH-Actions (reusable with the real logic). They
share the `name:` field so the UI treats them as one.
2. **"How many jobs does one `CI-maketest` workflow run have, and how
many matrix cells?"**
→ One job definition (`builds`), expanded to 6 matrix cells, so 6
parallel job-runs.
3. **"How many check runs does one `CI-maketest` workflow run create?"**
→ At minimum 6 (one per matrix cell, created by
`LouisBrunner/checks-action`); in practice often 12 because GitHub
auto-generates matching check runs for the same cells.
4. **"If `CI-maketest / builds (testgalera)` fails, which file on which
branch do I read to figure out why?"**
→ `ci-maketest.yml` on `GH-Actions`, specifically the `builds` job's
steps. The v3.0 caller is never where a real failure lives.
5. **"Where does the literal string `testgalera` come from?"**
→ It is one value in the `strategy.matrix.target` array inside
`ci-maketest.yml@GH-Actions`. It is *also* a Makefile target name
in the root `Makefile@v3.0`. The workflow picks the matrix value and
invokes the Makefile target in docker-compose.
If those five answers feel comfortable, you can close this section. If
not, re-read the [nesting diagram](#122-the-full-nesting-visualized) and
then the [two-branch diagram](#123-the-proxysql-two-branch-split-visualized)