Skip to content

v1.5.0 - #27

Merged
Paebbels merged 12 commits into
mainfrom
dev
Sep 16, 2026
Merged

Paebbels merged 12 commits into
mainfrom
dev

Conversation

@pytooling-claude

@pytooling-claude pytooling-claude Bot commented Sep 16, 2026 •

Copy link
Copy Markdown

Bug Fixes

  • The base image installs the packages that load its Unicode fonts. Common.list named the fonts - lm, lm-math, noto, noto-emoji, notomath, libertinus-fonts, libertinus-otf - but none of the machinery that selects them, so the image obtained it at run time through [MPM]AutoInstall=1, against a package database a container never refreshes. Six packages are installed when the image is built now:

    • unicode-math and newunicodechar - required by pytooling.sty itself.
    • fontspec - carries \setmainfont, \setsansfont and \setmonofont, and is what unicode-math builds on.
    • luaotfload and lualibs - LuaTeX's OpenType font loader and the Lua libraries it loads at startup.
    • luatex85 - required by Sphinx's LaTeX output for LuaTeX >= 0.85.

    A Sphinx PDF build in pytooling/miktex:sphinx failed on luaotfload and luatex85 with "module 'luaotfload-main' not found" and "Sphinx requires luatex85.sty".

  • l3backend was removed from MiKTeX's repository and is replaced by l3kernel. Image builds failed in miktex packages install with "Sorry, but: The requested package is unknown." - naming neither the package nor the file - but only on the mirrors that already carried the current package database. Of the entries in Common.list it was the only one the database no longer knows; l3packages is unchanged.

Known Issues

  • The remote package repository is chosen per run and is neither pinned nor logged, so a build depends on which mirror it visits - for how fast it is, whether it answers at all, and whether it carries the current package database.
  • The ci-* tags used while testing accumulate on Docker Hub, one pair per push, and nothing removes them. Promoting doesn't orphan them - the official tag names the same manifest - but the tag list grows.

GitHub Pipeline

  • An image reaches an official tag only after the checks passed. Images are built, pushed and tested as ci-<short sha>, and a new Publish job moves dev, release and latest onto the tested image with docker buildx imagetools create - the manifest is copied inside the registry, so the official tag and the tested tag share a digest. It needs every checking job, and runs only on the dev branch, a release commit or a release tag, so a feature branch no longer replaces the official tags. TriggerTaggedRelease and ReleasePage need it too, so a release is neither tagged nor announced when its images didn't reach the registry.
  • A failed image build no longer passes its own step. Docker.buildx.sh recognized build errors but never counted them, so it always exited 0, and both build steps piped into it without -o pipefail. A failed build surfaced one step later as No such image: <image>, naming the wrong step.
  • The reusable workflows of pyTooling/Actions move from @r7 to @r8. TagReleaseCommit.yml is identical in both lines; in PrepareJob.yml and PublishReleaseNotes.yml the @r7 version compared a literal string when checking the merge commit's second parent, so that guard never fired - the step that finds the release pull-request whose description becomes these notes.
  • actions/setup-python moves from @v6 to @v7, and sphinxcontrib-mermaid in the Sphinx example from ~= 2.0 to ~= 2.1.

Related Issues and Pull-Requests

claude-code and others added 4 commits September 16, 2026 18:46
'Common.list' carried the fonts - 'lm', 'lm-math', 'noto', 'notomath',
'libertinus-otf' - but nothing that loads them. 'pytooling.sty' requires
'unicode-math' and 'newunicodechar' directly, 'unicode-math' needs 'fontspec',
and LuaTeX's OpenType loader is 'luaotfload' with 'lualibs'. None of them was
listed, so the image obtained them at run time through '[MPM]AutoInstall=1',
which needs a package database the container never refreshed.

'luatex85' comes from the consumer side: Sphinx's LaTeX output requires it for
LuaTeX >= 0.85, and 'pytooling/miktex:sphinx' has been failing there with
"module 'luaotfload-main' not found" and "Sphinx requires luatex85.sty".

Unicode font support belongs to the base image rather than to the Sphinx
variant, so the six packages go into 'Common.list'.

Co-Authored-By: Patrick Lehmann <Paebbels@gmail.com>
Every image build fails in 'miktex packages install' with "Sorry, but: The
requested package is unknown.", and the '|| cat /var/log/miktex/mpmcli_admin.log'
fallback prints "No such file or directory", so the log never names the package.

Checking the repository manifest itself does: 'miktex-zzdb1-2.9.tar.lzma' holds
'mpm.ini' with 9099 package sections, and of the 107 entries in 'Common.list'
exactly one is missing from it - 'l3backend'. 'l3kernel' and 'l3packages' are
both present; 'l3kernel' takes its place, 'l3packages' stays as it was.

Which mirror a run happens to visit decides whether it fails: runs at 18:46 and
18:59 UTC passed, and 19:08 (tug.ctan.org) and 19:20 (mirrors.rit.edu) failed
with the same list. The mirrors that already carry the current database reject
the package, so this gets worse as the rest catch up.

Co-Authored-By: Patrick Lehmann <Paebbels@gmail.com>
'Docker.buildx.sh' counts nothing: it sets 'Counter_Error=0', recognizes build
errors with 'Pattern_ERROR' and exits with 'exit $Counter_Error', but the
branch matching that pattern only prints the line in red. The counter stays 0,
so the filter always exits 0.

Both build steps pipe 'docker buildx build' into it and carry no 'shell:' key,
so they run under 'bash -e' without '-o pipefail' and the step's status is the
filter's. A failed build therefore passed its own step, and the job died in the
next one with 'No such image: <image>' and "numfmt: invalid number: ''" - an
error naming the wrong step, which reads like a tagging problem. Run
35138670702 is an example: a package missing from 'Common.list' looked like a
fault of the change under test.

The error branch increments the counter again, and both build steps set
'-o pipefail' so that 'docker' failing without printing 'ERROR:' is caught too.

Checked against the filter directly: a clean log exits 0, a log with two
'ERROR:' lines exits 2, and the same log exits 0 on the current 'dev'.

Co-Authored-By: Patrick Lehmann <Paebbels@gmail.com>
@pytooling-claude pytooling-claude Bot added Font: OTF Open Type Font MPM Related to the MiKTeX Package Manager. Release Plan Unicode Related to Unicode support. labels Sep 16, 2026
Paebbels and others added 7 commits September 16, 2026 21:33
Co-authored-by: Patrick Lehmann <Paebbels@gmail.com>
Every run tagged its images 'dev', 'release' or 'latest' before a single check
had run, and pushed them right after the build. A push to any branch therefore
replaced 'miktex:dev' and 'miktex:sphinx-dev' for everyone, and an image that
failed its checks stayed under an official tag until the next run overwrote it.

The images are now built, pushed and tested as 'ci-<short sha>' and
'ci-<variant>-<short sha>'. 'SanityCheck', 'Document' and 'SanityCheck-Sphinx'
consume those, so the promoted image is the one that was tested, bit for bit.

The new 'Publish' job moves the official tags onto it with
'docker buildx imagetools create', which copies the manifest inside the
registry: no pull, and the tags share a digest. It needs every checking job,
and runs only where an official tag is defined - a release tag ('latest'), a
release commit ('release') and the 'dev' branch ('dev'). On every other branch
'publish_official' is 'false' and no official tag is written at all.

'TriggerTaggedRelease' and 'ReleasePage' now need 'Publish', so a release is
neither tagged nor published when its images didn't reach the registry.

Co-Authored-By: Patrick Lehmann <Paebbels@gmail.com>
'PrepareJob.yml', 'TagReleaseCommit.yml' and 'PublishReleaseNotes.yml' were
pinned to '@r7' while '@r8' is the current major line.

'TagReleaseCommit.yml' is identical in both. The other two differ in one
pattern only: 'FATHER_SHA' became 'SECOND_PARENT_SHA', and with it
'"{FATHER_SHA}" == ""' became '"${SECOND_PARENT_SHA}" == ""' - the '@r7'
version compares a literal string, so the guard for an empty second parent
never fires. That is the step which finds the release pull-request behind a
merge commit, and its description is what becomes the release notes. No input,
output or trigger differs between the two lines.

Co-Authored-By: Patrick Lehmann <Paebbels@gmail.com>
@Paebbels
Paebbels merged commit fd6e681 into main Sep 16, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Font: OTF Open Type Font MPM Related to the MiKTeX Package Manager. Release Plan Unicode Related to Unicode support.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants