Compare commits

..

1 Commits

Author SHA1 Message Date
clawbot
341c8afd76 Add Makefile shims for cibuild and precommit (closes #34)
All checks were successful
check / check (push) Successful in 19s
script/cibuild and script/precommit both existed and were already the
documented CI and pre-commit entrypoints, but neither had a Makefile
target, so the standing rule to drive the repo through make targets
rather than the underlying tool could not be followed for either.

It matters most for the build. A bare `docker build .` fails closed on
the CHECK_EPOCH guard by design, so script/cibuild is one of only three
supported ways to build an image here, and it was the only one of the
three without a target while `make docker` had one.

The two targets are thin shims in the same style as every other target
and change nothing about what the scripts do. .PHONY was already
complete for the targets that existed and now lists both new ones.

README.md's Entrypoints section gains the script-to-target mapping so
the two documents agree, including the two names that do not match:
script/install-precommit is `make hooks`, and script/precommit is
`make precommit`. It also warns that `make cibuild` runs two container
builds and costs minutes, so nobody types it expecting the runtime the
other make targets have.
2026-08-10 13:40:07 +00:00
2 changed files with 26 additions and 24 deletions

View File

@@ -78,21 +78,18 @@ provide:
- `script/cibuild` — the CI build: `script/lint` first, for fail-fast feedback, - `script/cibuild` — the CI build: `script/lint` first, for fail-fast feedback,
then the main image, which runs the non-lint checks then the main image, which runs the non-lint checks
- `script/install-precommit` — install the git pre-commit hook that runs - `script/install-precommit` — install the git pre-commit hook that runs
`script/precommit` `script/check`
Each of those has a Makefile shim of the same name — `make bootstrap`, Each of those has a Makefile shim of the same name — `make bootstrap`,
`make setup`, `make test`, `make lint`, `make fmt`, `make fmt-check`, `make setup`, `make test`, `make lint`, `make fmt`, `make fmt-check`,
`make check`, `make docker`, `make cibuild` — with one exception: `make check`, `make docker`, `make cibuild` — with one exception:
`script/install-precommit` is `make hooks`. `script/precommit`, which is what `script/install-precommit` is `make hooks`. `script/precommit`, which is what
the installed hook runs, is `make precommit`. Prefer the make targets; the the installed hook runs, is `make precommit`. Prefer the make targets; the
`Makefile` lists the operations you are expected to run. `Makefile` is the authoritative list of what this repo can do.
`make cibuild` is the slowest target: it is the only one that runs two container `make cibuild` is the slow one. It runs two container builds rather than
builds, the lint image first and then the main image. The two share the anything on the host, so budget minutes, not the seconds a `make`-shaped command
`script/bootstrap` layer byte-for-byte, so the pinned-Hugo compile described usually implies. That is the cost of the CI build, not a sign of a problem.
above is paid once per machine rather than twice, and once that layer is cached
a full `make cibuild` takes seconds. That is the cost of the CI build, not a
sign of a problem.
Every lint run for this repo happens inside a container, and only the lint does. Every lint run for this repo happens inside a container, and only the lint does.
`script/lint` has no host path and no "already inside a container?" branch, so `script/lint` has no host path and no "already inside a container?" branch, so

37
TODO.md
View File

@@ -50,22 +50,16 @@ leaning on `.gitignore` (https://git.eeqj.de/sneak/lora.vegas/issues/33).
now lists both. `README.md`'s Entrypoints section gained the script-to-target now lists both. `README.md`'s Entrypoints section gained the script-to-target
mapping, including the two names that do not match — mapping, including the two names that do not match —
`script/install-precommit` is `make hooks`, and `script/precommit` is `script/install-precommit` is `make hooks`, and `script/precommit` is
`make precommit` — plus a note that `make cibuild` is the slowest target `make precommit` — plus a warning that `make cibuild` costs minutes because it
because it is the only one that runs two container builds, while still taking is two container builds, so nobody types it expecting a `make`-shaped runtime.
seconds once the shared `script/bootstrap` layer is cached. The section's Verified that `make cibuild` earns its green rather than replaying a warm
pre-existing `script/install-precommit` bullet, which claimed the installed cache: one invocation ran both builds for real in sequence, each with its own
hook runs `script/check`, now says `script/precommit`, which is what the distinct `CHECK_EPOCH`, with `RUN script/bootstrap` `CACHED` above and no
script actually writes into `.git/hooks/pre-commit`. The stale Future Step check layer cached below it — the `Dockerfile.lint` build echoed its epoch and
asking for post-deploy confirmation of `static/_headers` is dropped here: it printed hugo's own build table, then the main image build echoed a different
was confirmed live on both hostnames epoch, ran `script/test` for the production build and `script/fmt-check` for
(https://git.eeqj.de/sneak/lora.vegas/issues/14). Verified that `make cibuild` the formatting check. `make precommit` passes on a clean tree, and
earns its green rather than replaying a warm cache: one invocation ran both `make check` passes
builds for real in sequence, each with its own distinct `CHECK_EPOCH`, with
`RUN script/bootstrap` `CACHED` above and no check layer cached below it — the
`Dockerfile.lint` build echoed its epoch and printed hugo's own build table,
then the main image build echoed a different epoch, ran `script/test` for the
production build and `script/fmt-check` for the formatting check.
`make precommit` passes on a clean tree, and `make check` passes
- 2026-08-10: moved the lint into Docker - 2026-08-10: moved the lint into Docker
(https://git.eeqj.de/sneak/lora.vegas/issues/38). A new root `Dockerfile.lint` (https://git.eeqj.de/sneak/lora.vegas/issues/38). A new root `Dockerfile.lint`
runs `hugo --minify --printPathWarnings` as a build step, so a successful runs `hugo --minify --printPathWarnings` as a build step, so a successful
@@ -342,6 +336,17 @@ outside this repo, so nothing there may be picked up as the Next Step.
- Delete the stale remote branches `feat/initial-site` and `security-audit`; - Delete the stale remote branches `feat/initial-site` and `security-audit`;
only the owner can remove them only the owner can remove them
(https://git.eeqj.de/sneak/lora.vegas/issues/15) (https://git.eeqj.de/sneak/lora.vegas/issues/15)
- After the next deploy, confirm the `_headers` file actually took effect, on
both `https://lora.vegas/` and `https://www.lora.vegas/`: `curl -sSI` against
each must show `strict-transport-security` or `content-security-policy`.
Cloudflare Pages silently ignores a malformed `_headers`, and checking
`x-content-type-options` would pass either way because the edge sends it
regardless. `www` has to be checked too and not just the apex: dropping
`includeSubDomains` rests on `www.lora.vegas` being served by this same Pages
project, which was established behaviourally from identical response bodies
rather than from the Cloudflare dashboard. If `www` turns out not to be
covered, the `includeSubDomains` decision has to be revisited
(https://git.eeqj.de/sneak/lora.vegas/issues/14)
- Decide the HSTS `includeSubDomains` and `preload` posture for `lora.vegas`. - Decide the HSTS `includeSubDomains` and `preload` posture for `lora.vegas`.
Both are owner calls: neither can be walked back inside the max-age window, Both are owner calls: neither can be walked back inside the max-age window,
and `includeSubDomains` binds hostnames this repo does not control and `includeSubDomains` binds hostnames this repo does not control