tests: add bluejay-ws runner-exclusion lint + fix 3 stale runner-fleet assertions #30
Reference in New Issue
Block a user
Delete Branch "runners/bluejay-ws-exclusion-lint-2026-05-26"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Adds
Runners_MustNotPinToOperatorWorkstationHostslint test enforcing operator directive 2026-05-26: BLUEJAY-WS / iamworkin-ws must never be a fleet GitHub Actions runner. Build-side analog of the Sprint 9 NEW safe-account exclusion gate. Scans every github-runner Deployment for forbidden nodeName, nodeSelector, nodeAffinity, and toleration pinning.See CLAUDE.md
Registering BLUEJAY-WS as a fleet GitHub Actions runnerCommon Mistakes entry andfeedback_bluejay_ws_never_public_runner.md.Also fixes 3 pre-existing lint failures
When the runner image bumped to
v20260525-ruby3.3.11-stepca(added asetup-runner-homeinitContainer), three assertions broke:MustRegisterRequiredReposAsRepoScopedDeployments�ContainerMappings().Should().ContainSingle()started finding 2 containers (init + main)MustSetWritableNonRootDotnetAndCachePaths� same root causeMustAvoidRwoMultiAttachForScaledDeployments�ReplicaCount(deployment).Should().Be(2)started failing whengithub-runner-print-webwas bumped toreplicas: 3per Sprint 24 CI right-sizing (#24)Fix #1+#2: new
MainContainerMappings()helper (containers only, excludes initContainers). The originalContainerMappings()is unchanged for callers that legitimately want both (probe assertions).Fix #3: relax
ReplicaCountassertion fromBe(2)toBeGreaterOrEqualTo(2). Semantic invariant isat least 2 replicas to avoid single-pod bottleneck; per-deployment tuning upward is valid.Verification
Lint baseline: 6 failed ? 3 failed. New test passes (not in failure list).
Remaining 3 failures are out of scope for this PR:
PublicReadWriteIngressRoutes_MustPinGetHeadPostOptionsAllowlist�FlowerCore.Updater/k8s/ingressroute.yamlis a historical scaffold diverged from canonicalapps/fc-updater/fc-updater.yaml. Fix in separate Updater PR.FcDeviceManagement_*�apps/fc-devicemgmt/argocd-application.yamlis missing. Needs operator domain decision on the right ArgoCD discovery convention.Diff
tests/bluejay-infra-lint/FleetManifestLintTests.cs+124 / -3Adds Runners_MustNotPinToOperatorWorkstationHosts lint test enforcing operator directive 2026-05-26: BLUEJAY-WS / iamworkin-ws must never be a fleet GitHub Actions runner. Build-side analog of the Sprint 9 NEW safe-account exclusion gate (Puppet GPO/AppLocker/WDAC/audit-forwarder modules refuse to apply on BLUEJAY-WS). Scans every github-runner Deployment for forbidden nodeName, nodeSelector, nodeAffinity match expressions, and toleration key/value pinning. See CLAUDE.md "Common Mistakes" entry and feedback_bluejay_ws_never_public_runner.md. Also fixes 3 pre-existing GitHubRunnerFleet_* lint failures that broke when the runner image bumped to v20260525-ruby3.3.11-stepca (added a setup-runner-home initContainer): * Add MainContainerMappings() helper (containers only, excludes initContainers) and switch GitHubRunnerFleet_MustRegisterRequiredReposAsRepoScopedDeployments + GitHubRunnerFleet_MustSetWritableNonRootDotnetAndCachePaths over to it. Without this, ContainerMappings().Should().ContainSingle() found the initContainer + runner = 2 containers and failed. * Loosen GitHubRunnerFleet_MustAvoidRwoMultiAttachForScaledDeployments ReplicaCount assertion from Be(2) to BeGreaterOrEqualTo(2). The semantic invariant is "at least 2 replicas so no single-pod bottleneck"; deployments tuned upward per 14d CI activity (e.g. github-runner-print-web at replicas: 3, see commit1f1f682PR #24) are valid. Lint baseline: 6 failed -> 3 failed (the 3 remaining are unrelated: PublicReadWriteIngressRoutes_* lives in FlowerCore.Updater/k8s/ ingressroute.yaml — separate PR; FcDeviceManagement_* needs operator domain decision on the missing apps/fc-devicemgmt/argocd-application.yaml). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>