The branch-protection + PR-gate + sidecar sequence is complete and verified. This records the finished state and fixes what the sequence itself proved wrong. CORRECTS A FALSE CLAIM I SHIPPED. PR #7 said the sidecar conversion would remove the one-per-start dockerd line "http: TLS handshake error from 127.0.0.1: EOF". It does NOT. Exactly one still appears, immediately after "API listen on [::]:2376" -- it is now the startupProbe's FIRST attempt, landing microseconds after dockerd begins listening and cut off by timeoutSeconds: 1; the next poll succeeds. Cosmetic, and deliberately not chased: raising the timeout to hide one benign startup line would slow every subsequent poll. The manifest comment now states this instead of the wrong prediction. Lands infra/gitea/require-gate.sh and verify-then-enforce.sh, which drove the rollout from a session temp dir. verify-then-enforce.sh merges nothing -- merging is a human's reviewed act -- but forces the reconcile and ABORTS unless the pod is healthy, a runner is online, and a real workflow goes green on it, before enabling enforcement and probing the push. Re-run it after any future act-runner change. Trims the now-obsolete feat/ rationale from claim-ship.sh: per-branch push triggers were deleted, so no prefix produces a duplicate run any more. CLAUDE.md's enforcement table flips from "weaker than this rule" to machine-enforced, with all four rows marked verified and the push rejection noted as PROVOKED rather than assumed. It also now states what a green PR does NOT prove: CLUSTER_AVAILABLE is unset, so L2/L3 never runs in CI and only the L0/L1 offline subset is covered. infra/gitea/README.md marks the sequence done and names the root cause that remains unfixed: Gitea repo settings live in its own database, invisible to Flux and unreadable by the conformance gate, so NOTHING detects drift from what this directory declares. These scripts assert desired state; they are not a detector. The check that reads the live API and fails on divergence is the highest-value work left, and it is the difference between this being fixed and this being unable to recur. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
51 lines
2.5 KiB
Bash
Executable File
51 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Items 1 + 2: make the gate a REQUIRED status check and require one approval.
|
|
#
|
|
# RUN THIS LAST. Prerequisites, in order:
|
|
# a) PR #7 (dind native sidecar) is MERGED, and
|
|
# b) you have SEEN a real workflow run go green on the converted pod.
|
|
# The runner Deployment is the merge gate for the whole repo. Turning on a required check
|
|
# while the runner is broken means no PR can merge -- including the revert. (Recoverable:
|
|
# an owner can set enable_status_check back to false. But do not rely on that.)
|
|
#
|
|
# Requires exactly ONE context: `gate / gate (pull_request)`.
|
|
# * NOT `gate / conformance (*)` -- that job is `if: false`, and a skipped Gitea job reports
|
|
# SUCCESS ("Has been skipped"). Requiring it would pass VACUOUSLY forever while nothing
|
|
# ran, which under HARD RULE 4 is worse than a deadlock: a deadlock is loud.
|
|
# * NOT the `(push)` variant -- after PR #6 there are no per-branch push runs at all, so a
|
|
# PR would never produce that context.
|
|
set -euo pipefail
|
|
HOST=gitea.home.keithjackson.dev; OWNER=Home-Network; REPO=home-network-k3s-impl
|
|
creds="$(printf 'protocol=https\nhost=%s\n\n' "$HOST" | git credential fill)"
|
|
U="$(sed -n 's/^username=//p' <<<"$creds")"; P="$(sed -n 's/^password=//p' <<<"$creds")"
|
|
api() { curl -sS --config <(printf 'user = "%s:%s"\n' "$U" "$P") "$@"; }
|
|
|
|
echo "==> updating branch protection on main"
|
|
jq -n '{
|
|
enable_push: false,
|
|
enable_status_check: true,
|
|
status_check_contexts: ["gate / gate (pull_request)"],
|
|
required_approvals: 1,
|
|
block_on_rejected_reviews: true,
|
|
dismiss_stale_approvals: true,
|
|
block_on_outdated_branch: false
|
|
}' | api -X PATCH -H 'Content-Type: application/json' --data @- \
|
|
"https://${HOST}/api/v1/repos/${OWNER}/${REPO}/branch_protections/main" >/dev/null
|
|
|
|
echo "==> verifying"
|
|
api "https://${HOST}/api/v1/repos/${OWNER}/${REPO}/branches/main" \
|
|
| jq -r '{protected,user_can_push,enable_status_check,status_check_contexts,required_approvals}'
|
|
|
|
cat <<'NOTE'
|
|
|
|
NOTE ON required_approvals: 1 -- Gitea will not let an author approve their own PR.
|
|
* Agent-opened PRs (author gitea-admin) are approved by jakman85. Fine.
|
|
* PRs YOU open as jakman85 need gitea-admin to approve. If that is awkward, either open
|
|
agent work as gitea-admin and review as jakman85, or set required_approvals back to 0
|
|
and rely on the status check alone.
|
|
|
|
Then prove it, rather than trusting the API:
|
|
git commit --allow-empty -m probe && git push origin main # EXPECT: rejected
|
|
git reset --hard HEAD~1
|
|
NOTE
|