docs(ci): Publish to libtmux.org alongside git-pull.com - #756
Open
tony wants to merge 8 commits into
Open
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## docs-site #756 +/- ##
=============================================
+ Coverage 52.37% 52.45% +0.08%
=============================================
Files 26 26
Lines 3729 3729
Branches 747 747
=============================================
+ Hits 1953 1956 +3
+ Misses 1472 1469 -3
Partials 304 304 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
tony
marked this pull request as ready for review
September 6, 2026 11:36
why: The sync wrote the whole bucket root with --delete, which is the shape libtmux.org's per-port prefixes exist to prevent, and it left the Python docs outside the site: every /en/py/<version>/ URL 403s because no port tree has been published. libtmux/docs is public as of today, so its reusable deploy workflow can be called from here. what: - Split the job: build uploads docs/_build/html, publish calls libtmux/docs reusable-deploy.yml and deploys only en/py/latest - Pass path-prefix unprefixed by locale; the workflow prepends it - Add the workflow-level concurrency group every caller must set - Drop LIBTMUX_DOCS_STANDALONE: the tree is nested now, so the shell's chrome and site-wide search are reachable and belong on - Pin the reusable workflow to a commit rather than a moving branch
why: The SHA pin stood in for a tag that did not exist when this was written; libtmux/docs has since tagged v1, which is the ref its own header asks callers to use and bump on review. what: - Point the publish job at @v1, whose reusable-deploy.yml is byte-identical to the commit it replaces
why: The previous shape moved the publish, which would have stopped libtmux.git-pull.com updating the moment it merged. Serving both costs one more build and leaves a failure on the new side with no effect on the old one. what: - Build twice: the two sites need different bytes, not one artifact published to both. git-pull.com is served at a root and is built standalone; libtmux.org nests at en/py/latest and carries the shell - Publish git-pull.com from inside its own build, exactly as before, rather than behind an artifact that would not keep its symlinks - Give libtmux.org its own LIBTMUX_ORG_* secrets, leaving LIBTMUX_DOCS_* meaning what it means today - Move the paths-filter gate into its own job, so one output feeds both and no step repeats the condition - Pin the shared workflow to v2
why: libtmux/docs deleted v1 and v2, so the `@v2` here resolved to nothing and this workflow could not have started. Its replacement is a 0.x prerelease series documented as moving, and a ref that can be repointed changes what executes in this repository — with `id-token: write` and a role that can write the bucket — without a diff here or a review. what: - Pin the commit the deleted tag pointed at, whose reusable-deploy.yml is byte-identical to both deleted tags - Name the release it belongs to in a trailing comment, which is the form Dependabot reads to offer a bump
why: libtmux/docs has settled its convention — callers pin a full-length commit and name the release beside it — and the commit carrying that is the one to depend on. Its reusable-deploy.yml differs from the pinned one in comments only; the parsed workflow is identical. what: - Pin e30bcba4, which tag v0.1.0-alpha.1 names - Correct this comment: it claimed Dependabot would offer the bump, and nothing here will, since the repository has no dependabot.yml
/en/py/latest/ 403s on libtmux.org — nothing has published under a port version prefix. This lets the branch publish without merging, which also sidesteps the base-branch problem: this PR targets docs-site, so merging it would trigger nothing. Repinned to ce9d7ed, which fixes the manifest upsert: jq precedence made it add an array to an object, so every publish failed after syncing. Found on the first real run, from libtmux-rs. libtmux.git-pull.com is unaffected — its leg publishes in the job before. Drop docs-site-deploy from the trigger when merging to master.
/en/py/latest/ was serving Furo, and /en/py/latest/concepts/ 403'd — so the port switcher was broken for Python from every shared page. The libtmux.org leg uploaded docs/_build/html, on the assumption that the Sphinx site is this port's tree. It is not: en/py/latest/ is the shared shell rendered with Python's code fences, and the gp-sphinx output belongs at en/py/latest/api/ inside it. Publishing Sphinx to the prefix replaced the whole tree, api and all. That leg now runs libtmux/docs's build-site.sh, which renders the shell and runs sphinx itself from this checkout, and uploads the assembled en/py/latest. Without --skip-refs, because Python's api/ is the real render rather than the redirect stub every other port gets — it is what check-style-parity.mjs measures against. libtmux.git-pull.com is untouched: its leg still builds standalone and publishes in-job, before this one runs.
tony
force-pushed
the
docs-site-deploy
branch
from
September 6, 2026 14:50
74c2be2 to
16ec75d
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #755 — review that one first. This branch is #755 plus the deploy work.
Additive: libtmux.git-pull.com keeps publishing exactly as it does today, and libtmux.org is added alongside it. Nothing stops updating when this merges.
Summary
libtmux.orgunderen/py/latest/, throughlibtmux/docs's sharedreusable-deploy.yml— the same workflow every port calls, which writes only that port's own prefix.master, running inside its own build job.LIBTMUX_ORG_*for the new destination,LIBTMUX_DOCS_*left meaning exactly what it means today.Why two builds and not one artifact twice
en/py/latest//_shell/shell.js/search/LIBTMUX_DOCS_STANDALONE=1One artifact published to both is wrong in one direction or the other: set the flag and libtmux.org gets an unskinned nested site with the wrong search; unset it and git-pull.com gets a
/search/that redirects to itself.tests/test_docs_conf.pypins both shapes, including the empty-string form the matrix passes.The git-pull.com sync stays inside its build job rather than moving behind an artifact. It is a live site, and
upload-artifactdoes not preserve the symlinks that sync is explicitly told to follow.Secrets
Set, and verified present on the repository — three for each destination:
LIBTMUX_ORG_ROLE_ARN,LIBTMUX_ORG_BUCKET,LIBTMUX_ORG_DISTRIBUTIONLIBTMUX_DOCS_ROLE_ARN,LIBTMUX_DOCS_BUCKET,LIBTMUX_DOCS_DISTRIBUTIONThe role trusts
repo:tmux-python/libtmux:environment:docs— the name-only subject, which this repo can use because it predates GitHub's 2026-07-15 immutable-subject cutoff.Still unset, and worth doing before or soon after this merges: the
docsenvironment has no protection rules. A deployment branch-and-tag policy (master,v*) is what actually restricts which refs may publish, sinceenvironment:rewrites the OIDCsubclaim to drop anyref:clause.Verification, and its limit
docs.ymltriggers only on push tomaster, so no PR check exercises any of this. First execution is the merge. What I could check instead:master's — compared as parsed YAML, not by eyepath-prefix: py/latestpublishes toen/py/latest—reusable-deploy.ymlprepends$locale/wheneverportis set, so passingen/py/latestwould double itpy/latestpasses that workflow's own prefix validation: unrooted, no.., not a bare reserved top-level nameworkflow_callblock rather than against the exampleversion-kind: trunkis one of the kinds it acceptsdist/and syncsdist/, so the tree must be at the artifact root —path: docs/_build/htmlgives thatreusable-deploy.ymlparses identically to the previously pinned one — its diff is comments only, compared as parsed YAML rather than readconcurrency.queueis valid despiteactionlint1.7.12 rejecting it: it is in GitHub's published workflow schema, anddeploy-shell.ymlinlibtmux/docsuses it with successful runs. That is actionlint lagging, and it is the only diagnostic it reports on this fileOne departure from the documented recipe
reusable-deploy.yml's header asks callers to pin a tag. This pins a commit, with the release named in a trailing comment — the form Dependabot reads to offer a bump.libtmux/docshas cut and deletedv1andv2, and its replacement is a 0.x prerelease series documented as moving. Thisuses:runs another repository's workflow inside this one, withid-token: writeand a role that can write the bucket, so a ref that can be repointed means what executes here changes with no diff in this repository and no review. A commit cannot be repointed. The pinned commit is the one the deletedv2pointed at, and itsreusable-deploy.ymlis byte-identical to every other candidate.This is deliberately unlike the rest of the file, which pins moving majors (
actions/checkout@v7,actions/cache@v6). Those are first-party actions running with this workflow's own permissions; this one runs a third party's workflow withid-token: writeand bucket-write credentials, which is the case the pinning guidance is actually about.Note the trailing comment is documentation here, not automation: this repository has no
.github/dependabot.yml, so nothing will offer the bump. Bumping is manual until one exists.The Cloudflare purge stays, unlike the previous revision of this branch — it fronts libtmux.git-pull.com, which is still being published.