Retire v6 preview demo target after GA

This commit is contained in:
rcourtman 2026-07-04 16:16:57 +01:00
parent 72c8d9677a
commit de0c5ff5c1
11 changed files with 93 additions and 166 deletions

View file

@ -503,7 +503,6 @@ func TestDockerAndDemoBuildsUseCanonicalReleaseLdflags(t *testing.T) {
workflowRequired := []string{
`./scripts/release_ldflags.sh server --version "${VERSION}" --build-time "${BUILD_TIME}" --git-commit "${GIT_COMMIT}"`,
`-buildvcs=false`,
`demo-preview-v6`,
`demo-stable`,
`workflow_dispatch:`,
`target:`,
@ -513,6 +512,9 @@ func TestDockerAndDemoBuildsUseCanonicalReleaseLdflags(t *testing.T) {
t.Fatalf("deploy-demo-server workflow missing canonical release ldflags usage: %s", needle)
}
}
if strings.Contains(workflow, `preview-v6`) || strings.Contains(workflow, `demo-preview-v6`) {
t.Fatal("deploy-demo-server workflow must not keep a separate v6 preview demo target after GA")
}
}
func TestAgentRuntimeImagePersistsAgentIdentityByDefault(t *testing.T) {

View file

@ -410,9 +410,10 @@ class ReleasePromotionPolicyTest(unittest.TestCase):
self.assertNotIn("docs/releases/RELEASE_NOTES_v6.md", demo_copy)
self.assertNotIn("docs/releases/V6_RC_OPERATOR_SUPPORT_PACK.md", demo_copy)
def test_update_demo_server_workflow_uses_generic_tag_examples(self) -> None:
def test_update_demo_server_workflow_uses_stable_tag_example(self) -> None:
workflow = read(".github/workflows/update-demo-server.yml")
self.assertIn("v6.0.0-rc.N or v6.0.0", workflow)
self.assertIn("Stable release tag to deploy (e.g., v6.0.0)", workflow)
self.assertIn("Prerelease demo updates are retired after v6 GA", workflow)
self.assertNotIn("v6.0.0-rc.1", workflow)
def test_rehearsal_template_and_workflow_capture_ga_rehearsal_record(self) -> None:
@ -701,14 +702,14 @@ class ReleasePromotionPolicyTest(unittest.TestCase):
self.assertNotIn("provenance: false", publish)
self.assertIn("control_plane.py --branch-for-version", promote)
self.assertIn("control_plane.py --branch-for-version", demo)
self.assertIn("preview-v6", demo)
self.assertIn("demo-preview-v6", demo)
self.assertIn("demo-stable", demo)
self.assertIn("Refusing prerelease tag", demo)
self.assertIn("Refusing stable tag", demo)
self.assertIn("latest published release for target", demo)
self.assertIn('SERVICE_NAME="pulse-v6-preview"', demo)
self.assertIn("Preview demo updates must not target the stable pulse service.", demo)
self.assertIn("Prerelease demo updates are retired after v6 GA", demo)
self.assertIn("Latest published stable release", demo)
self.assertNotIn("preview-v6", demo)
self.assertNotIn("demo-preview-v6", demo)
self.assertNotIn('SERVICE_NAME="pulse-v6-preview"', demo)
self.assertNotIn("Preview demo updates must not target the stable pulse service.", demo)
self.assertIn("tailscale/github-action@4e4c49acaa9818630ce0bd7a564372c17e33fb4d # v2", demo)
self.assertIn("TS_AUTHKEY", demo)
self.assertIn("DEMO_EXPECTED_HOSTNAME", demo)
@ -724,8 +725,10 @@ class ReleasePromotionPolicyTest(unittest.TestCase):
self.assertIn("extract_entry_asset()", demo)
self.assertIn(r'<script\b[^>]*\bsrc=\"(/assets/index-[^\"]*\.js)\"', demo)
self.assertIn("Public demo is serving $PUBLIC_ASSET but the target service is serving $REMOTE_ASSET.", demo)
self.assertIn('SERVICE_NAME="pulse-v6-preview"', preview_deploy)
self.assertIn("Preview demo deployments must not target the stable pulse service.", preview_deploy)
self.assertNotIn("preview-v6", preview_deploy)
self.assertNotIn("demo-preview-v6", preview_deploy)
self.assertNotIn('SERVICE_NAME="pulse-v6-preview"', preview_deploy)
self.assertNotIn("Preview demo deployments must not target the stable pulse service.", preview_deploy)
self.assertIn("DEMO_EXPECTED_HOSTNAME", preview_deploy)
self.assertIn("Verify target host identity", preview_deploy)
self.assertIn("Demo environment points at host $REMOTE_HOSTNAME but expected $DEMO_EXPECTED_HOSTNAME.", preview_deploy)
@ -762,9 +765,9 @@ class ReleasePromotionPolicyTest(unittest.TestCase):
self.assertIn("helm status pulse || true", helm_pages)
self.assertIn("kubectl describe pods -A || true", helm_pages)
self.assertIn("kubectl get events -A --sort-by=.lastTimestamp || kubectl get events -A || true", helm_pages)
self.assertIn('TARGET="preview-v6"', release_workflow)
self.assertIn('TARGET="stable"', release_workflow)
self.assertIn('gh workflow run update-demo-server.yml --ref "${REQUIRED_BRANCH}" -f tag="${{ needs.prepare.outputs.tag }}" -f target="${TARGET}"', release_workflow)
self.assertIn("Prerelease public demo update skipped; post-GA demo target is stable only.", release_workflow)
self.assertIn('gh workflow run update-demo-server.yml --ref "${REQUIRED_BRANCH}" -f tag="${{ needs.prepare.outputs.tag }}" -f target="stable"', release_workflow)
self.assertNotIn('TARGET="preview-v6"', release_workflow)
self.assertIn("sync_chart_release_metadata.py", helm)
self.assertIn("sync_chart_release_metadata.py", helm_pages)
self.assertIn("--chart deploy/helm/pulse/Chart.yaml", helm)
@ -776,8 +779,9 @@ class ReleasePromotionPolicyTest(unittest.TestCase):
self.assertIn("raw.githubusercontent.com/{repo}/{tag}/docs/images/pulse-logo.svg", chart_sync)
self.assertIn("both stable and prerelease releases dispatch", runbook)
self.assertIn("Release `6.0.0` from `pulse/v6-release`", runbook)
self.assertIn("separate v6 preview demo environment", runbook)
self.assertIn("preview-v6", runbook)
self.assertIn("Prerelease public demo deployment is retired after v6 GA", runbook)
self.assertNotIn("separate v6 preview demo environment", runbook)
self.assertNotIn("preview-v6", runbook)
self.assertIn(promotion_metadata_envelope(), normalize_ws(runbook))
self.assertIn("waitUntil: 'domcontentloaded'", demo_smoke)
self.assertIn("getByLabel('Username').waitFor({ state: 'visible', timeout: 120000 })", demo_smoke)

View file

@ -152,14 +152,14 @@ class SubsystemLookupTest(unittest.TestCase):
self.assertEqual(match["verification_requirement"]["id"], "mobile-relay-runtime")
def test_lookup_paths_normalizes_workspace_relative_cross_repo_runtime_paths(self) -> None:
result = lookup_paths(["repos/pulse-pro/scripts/bootstrap-v6-demo-preview.sh"])
result = lookup_paths(["repos/pulse-pro/scripts/grandfathered_recurring_cutover_preview.py"])
self.assertEqual(result["unowned_runtime_files"], [])
self.assertEqual(
{item["subsystem"] for item in result["impacted_subsystems"]},
{"cloud-paid"},
)
file_entry = result["files"][0]
self.assertEqual(file_entry["path"], "pulse-pro:scripts/bootstrap-v6-demo-preview.sh")
self.assertEqual(file_entry["path"], "pulse-pro:scripts/grandfathered_recurring_cutover_preview.py")
self.assertEqual(file_entry["classification"], "runtime")
self.assertEqual(
{match["subsystem"] for match in file_entry["matches"]},
@ -169,7 +169,7 @@ class SubsystemLookupTest(unittest.TestCase):
self.assertEqual(match["lane_context"]["lane_id"], "L3")
self.assertEqual(
match["verification_requirement"]["id"],
"public-demo-preview-operations",
"legacy-grandfathering-cutover",
)
def test_lookup_paths_assigns_shared_tag_badges_to_frontend_primitives(self) -> None: