Skip to content

feat: let a bake reach more than one service - #798

Merged
lens0021 merged 2 commits into
mainfrom
claude/bake-hosts
Sep 22, 2026
Merged

lens0021 merged 2 commits into
mainfrom
claude/bake-hosts

Conversation

@claude

@claude claude Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Requested by lens0021 · project thread

Before: actions/bake took a single host-alias, one name mapped to one address — enough while Chart's renderer was the only service a site pointed MediaWiki at during a bake.

After: it takes a hosts list, a name=address to a line, so a site with a second service gives each one its own line.

hosts: |
  host.docker.internal=${{ steps.renderer.outputs.address }}
  some-other-service=${{ steps.other.outputs.address }}

What this is

This is the "let a bake reach more than one service" half of the original combined change, split out so it stands on its own — it is a capability of the released actions/bake, independent of any one site's services.

It defaults to host.docker.internal=host-gateway, exactly what host-alias defaulted to, so a site with one service sets nothing and behaves as before. A line without = is a name with nowhere to go, and the action fails loudly rather than baking against a service it cannot reach.

The input is unreleased — 1.2.0 has not gone out — so no site carries the old spelling. The two workflows that dogfood the action (deploy-docs, pr-preview) move to the new name here; smoke hand-rolls --add-host and does not use this input, so it is untouched.

Split

The Score documentation that motivated this rides on top, in a separate PR (#796, based on this branch), so each lands as its own release-note line. Because the repo hides docs: from the changelog and surfaces feat:, splitting also puts this capability correctly under Features rather than burying it inside a docs entry.

Note on the last commit

The test: commit on top is the Citizen flake fix from #797, carried here so this PR — and #796 stacked on it — is green for review. It becomes a no-op once #797 merges.

🤖 Generated with Claude Code

https://claude.ai/code/session_01HnGL1B3zcDSmmc9XBAPcWg

host-alias mapped one name to one address, which was enough while
Chart's renderer was the only service a site pointed MediaWiki at during
a bake. actions/bake takes a hosts list instead -- a "name=address" a
line -- so a site with a second service, such as a Shellbox, gives each
one its own line.

It defaults to host.docker.internal=host-gateway, which is what
host-alias defaulted to, so a site with one service sets nothing. A line
without "=" is a name with nowhere to go, and the action says so rather
than baking against a service it cannot reach.

The input is unreleased -- 1.2.0 has not gone out -- so no site carries
the old spelling. The two workflows that dogfood the action move to the
new name here; nothing else changes for a one-service site.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HnGL1B3zcDSmmc9XBAPcWg
… one

The view-source tab's width was measured once, immediately after an
attribute assertion, and read 0 often enough to turn smoke red on three
different commits in one afternoon -- one of which passed on a re-run of
the same commit, which is what says it is the measurement and not the tab.

The tab is fine by the time anyone looks: its href and its icon mask both
assert cleanly in the same test, and the failure is always a flat 0
against a history tab that has already been laid out. The skin sizes the
page actions once the styles it is still fetching land, and a run where
that lands a moment later measured a tab that was not sized yet.

So poll instead of measuring the once. The assertion is the same ratio it
was; it is just allowed to arrive.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HnGL1B3zcDSmmc9XBAPcWg
(cherry picked from commit 406121f)
(cherry picked from commit 8616083)
(cherry picked from commit 3ac0f7e)
@github-actions
github-actions Bot temporarily deployed to preview September 22, 2026 01:13 Destroyed
@lens0021
lens0021 marked this pull request as ready for review September 22, 2026 04:18
@lens0021
lens0021 merged commit 2d25205 into main Sep 22, 2026
31 checks passed
@lens0021
lens0021 deleted the claude/bake-hosts branch September 22, 2026 04:18
claude Bot pushed a commit that referenced this pull request Sep 22, 2026
<!-- ccr-projects-attribution: {"github_login":"lens0021"} -->
_Requested by **lens0021** · [project
thread](https://claude.ai/code/project/chan_01EZp6MxSW4HYd9cdG5YMsLF?thread=cmsg_01EZp6MxSW4HYd9cdG5YMsLF3vYPtZMjxWAZ7gwm8PSJ7P)_

Score is the fourth extension this site documents and the second of
Chart's kind: it wants a program of its own beside the bake. It does not
run LilyPond itself — it sends the command to a **Shellbox**, which is
what its own message asks for, since LilyPond has had no safe mode since
2.23.12 and a `<score>` is a program it will run.

> **This is the Score half of the original #796.** The "let a bake reach
more than one service" capability was split into #798, which has since
merged; this branch is rebased onto `main` and is now Score-only, a
single commit.

## The Shellbox comes from upstream

Wikimedia already publishes one. `mediawiki-libs-shellbox` builds a
`score83` flavour — LilyPond from bookworm-backports, Ghostscript,
ImageMagick, and the Noto fonts lyrics want — and runs it as the
`shellbox` service in `operations/deployment-charts`. This takes that
image and lets them keep it up to date, rather than wikven maintaining a
Dockerfile full of LilyPond.

It is php-fpm alone, so it speaks FastCGI rather than HTTP and upstream
puts an httpd in front of it. A `services.json` entry can name an
`image` to pull and a `sidecar` to run in the service's own network
namespace — which is how the two share a localhost in a pod. One address
still reaches the pair.

An entry may also name a `probe`, and naming one means that path has to
answer **200** rather than merely answer. An httpd says 502 on its own
while what is behind it is still starting, and `/healthz` reaches
Shellbox through the whole chain, so it is the readier signal.

## Two quiet failures, documented

Both send the build down the local path, where a bake has no LilyPond,
so the page fills with an error instead of music:

- The key under `ShellboxUrls` is `score`, the service. It is not
`score-lilypond`, which is the route.
- `ShellboxSecretKey` is not optional even though MediaWiki lets it be:
without it, `getUrl()` returns null and the command runs locally.

A score that cannot be engraved is published as an error box with the
build none the wiser, as a chart was, so `score-error-category` joins
`WikvenFailOnCategories`.

## Checks

- The bake sends four requests to the Shellbox, and the page comes back
with an `<svg>` and a PNG beside it, both files the build wrote.
- Broken on purpose: the `ShellboxUrls` route name, then the missing
secret — each sent the work back to the local path with nothing said,
which is what the page now warns about.
- All 28 bake assertions pass, verified end to end in CI: the upstream
image pulled, the sidecar attached, `/healthz` answered, and the two
bakes stayed byte-identical.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01HnGL1B3zcDSmmc9XBAPcWg

Co-authored-by: Claude <noreply@anthropic.com>
lens0021 pushed a commit that referenced this pull request Sep 27, 2026
🤖 I have created a release *beep* *boop*
---


##
[1.2.0](v1.1.0...v1.2.0)
(2026-09-24)


### Features

* let a bake reach more than one service
([#798](#798))
([2d25205](2d25205))
* say above the tables what baked the site
([#774](#774))
([7f36389](7f36389))
* say what built a site, in the footer of every page
([#799](#799))
([2b17d0b](2b17d0b))
* say what the translations phase spends its time on
([#800](#800))
([eb78cfa](eb78cfa))


### Bugfixes

* copy the pictures an extension serves out of its own directory
([#787](#787))
([541a21a](541a21a))
* give a chart's identifiers numbers of the page's own
([#782](#782))
([659d8dd](659d8dd))
* import again, in a fresh boot, the pages that waited on another page
([#772](#772))
([1a58d19](1a58d19))
* name the page an import refuses instead of ending in a trace
([#765](#765))
([8506b52](8506b52))
* turn off JsonConfig's cache for a build that makes what it reads
([#770](#770))
([feff623](feff623))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This was referenced Sep 27, 2026
This was referenced Oct 9, 2026

This branch was successfully deployed

No deployments
preview — b571db87 Deployed Sep 22, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants