You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 03ab6c7
Browse filesBrowse the repository at this point in the historyBrowse files
fix(e2e): fail fast on a wedged cluster; devcontainer Git identity + SSH signing bootstrap (#309)
* fix(e2e): fail fast when a stamped cluster is wedged
`.stamps/cluster/<ctx>/ready` only proves a past bring-up succeeded. A
cluster left wedged by a host suspend/resume or OOM keeps its stamp, so
every task depending on `_cluster-ready` reads "up to date" and the run
walks straight into the suite, which then hangs until the 30m ginkgo
timeout.
Add a live probe as a `preconditions:` entry rather than a `status:` one.
As a status entry a failed probe would only re-run start-cluster.sh,
which has to re-derive the same verdict slowly inside its 60-attempt
retry loop; as a precondition it aborts immediately with the cleanup
instructions. `test -f .../ready || exit 0` keeps the first run (nothing
stamped, no cluster yet) out of the way.
Also lower the health-path kubectl timeouts in start-cluster.sh to 5s and
give the post-bring-up sanity `get ns` a timeout, so no step in the
bring-up graph can hang unbounded.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(devcontainer): let Git enforce signing; decouple it from container creation
Creating a usable development environment, personalizing Git, and having
signing credentials available are three separate things. The scripts
treated them as one: post-create.sh required an identity, and
sync-signing-key.sh required a forwarded SSH agent, both under `set -e`.
A container created before any interactive session attaches -- a Dev
Containers CLI `devcontainer up`, or a platform that personalizes the
workspace afterwards -- could therefore never finish creating.
Signing stays mandatory, but plain Git configuration now enforces it
rather than shell logic:
commit.gpgsign=true
gpg.format=ssh
gpg.ssh.defaultKeyCommand=ssh-add -L
With those three set, a commit with no key reachable fails on its own
("fatal: either user.signingkey or gpg.ssh.defaultKeyCommand needs to be
configured"), so no hook has to fail to keep unsigned commits impossible,
and nothing else in the environment is held back by a missing key.
Key selection keeps its existing meaning -- an agent key whose comment
contains the Git email wins over agent order -- but the match is now
pinned as a literal `key::` value instead of a public key file this
script wrote and configured by path. With no match there is no pin at
all, and the key command resolves the key per commit, so the common case
can no longer go stale. The previous file-based pin is retired on the
next sync, and only when it is still the exact path this script managed.
A signing key configured by the developer or by the platform is never
overwritten.
Fixes the allowed_signers principal, which was "Name <email>". That file
takes bare identities, so ssh-keygen rejected the line and a correctly
signed commit failed to verify with "allowed_signers:1: invalid key /
No principal matched". It is now the Git email, with the key comment
kept, and every key in the agent is listed so verification works
whichever one signed.
Identity resolution keeps its existing Git-config-then-GIT_USER_NAME/
GIT_USER_EMAIL precedence and is now a warning rather than a hard stop.
gpg.format, gpg.ssh.defaultKeyCommand and gpg.ssh.allowedSignersFile are
only filled in when unset, so a developer or platform that has already
chosen a signing mechanism keeps it. Nothing platform-specific is added.
test-signing.sh covers all of it against a disposable ssh-agent and
generated throwaway keys, including that a commit is refused when no key
is available and verifies for the configured email when one is.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* feat(devcontainer): keep the gh CLI logged in across rebuilds
~/.config/gh was not among the persisted volumes, so every container
rebuild dropped the token and gh went back to "To get started with GitHub
CLI, please run: gh auth login".
Mount it as a named volume, the same way .claude, .codex and .kube are
already handled. The first rebuild after this starts from an empty volume
and needs one more login; after that it sticks.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
0 commit comments