This is an automated email from the ASF dual-hosted git repository.
zqr10159 pushed a commit to branch 2.0.0
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git
The following commit(s) were added to refs/heads/2.0.0 by this push:
new 0a82473074 Gate frontend verify on three-signal cutoff
0a82473074 is described below
commit 0a8247307418a4fc670f18176f2ae48a0122c1a0
Author: Logic <[email protected]>
AuthorDate: Tue Jun 9 18:04:04 2026 +0800
Gate frontend verify on three-signal cutoff
---
web-next/package.json | 3 ++-
web-next/scripts/release-checklist.mjs | 11 ++++++++-
web-next/scripts/release-checklist.test.ts | 28 ++++++++++++++++++++--
.../scripts/release-readiness-contract.test.ts | 16 +++++++++++++
4 files changed, 54 insertions(+), 4 deletions(-)
diff --git a/web-next/package.json b/web-next/package.json
index 94a7c4a4ae..3505d95536 100644
--- a/web-next/package.json
+++ b/web-next/package.json
@@ -15,7 +15,8 @@
"release:budget": "node ./scripts/release-budget.mjs",
"release:compose": "node ./scripts/release-compose.mjs",
"release:checklist": "node ./scripts/release-checklist.mjs",
- "verify": "npm run lint && npm run test && npm run i18n:report && npm run
route:matrix",
+ "three-signal:cutoff": "node
./scripts/three-signal-alpha-cutoff-report.mjs",
+ "verify": "npm run lint && npm run test && npm run i18n:report && npm run
route:matrix && npm run three-signal:cutoff",
"verify:full": "npm run build && npm run release:budget && npm run
release:compose && npm run release:checklist && npm run verify",
"i18n:report": "node ./scripts/i18n-report.mjs"
},
diff --git a/web-next/scripts/release-checklist.mjs
b/web-next/scripts/release-checklist.mjs
index ed1c6a0e2d..c1e30717c6 100644
--- a/web-next/scripts/release-checklist.mjs
+++ b/web-next/scripts/release-checklist.mjs
@@ -69,6 +69,14 @@ export const RELEASE_CHECKLIST_ITEMS = [
files.gateway.includes('location ^~ /api/') &&
files.gateway.includes('location /') &&
files.gateway.includes('proxy_pass http://hertzbeat:1157;')
+ },
+ {
+ key: 'three-signal-alpha-cutoff-evidence',
+ label: 'Three-signal alpha cutoff evidence report runs in frontend
verification',
+ verify: files =>
+ files.packageJson.scripts?.['three-signal:cutoff'] === 'node
./scripts/three-signal-alpha-cutoff-report.mjs' &&
+ files.packageJson.scripts?.verify?.includes('npm run
three-signal:cutoff') &&
+ files.threeSignalAlphaCutoff.includes('verifyThreeSignalAlphaCutoff')
}
];
@@ -84,7 +92,8 @@ export function readReleaseChecklistFiles(rootDir = repoRoot)
{
compose:
readRepoFile('script/docker-compose/hertzbeat-postgresql-victoria-metrics-next-observability/docker-compose.yaml'),
gateway:
readRepoFile('script/docker-compose/hertzbeat-postgresql-victoria-metrics-next-observability/nginx/default.conf'),
releaseBudget: readRepoFile('web-next/scripts/release-budget.mjs'),
- releaseCompose: readRepoFile('web-next/scripts/release-compose.mjs')
+ releaseCompose: readRepoFile('web-next/scripts/release-compose.mjs'),
+ threeSignalAlphaCutoff:
readRepoFile('web-next/scripts/three-signal-alpha-cutoff-report.mjs')
};
}
diff --git a/web-next/scripts/release-checklist.test.ts
b/web-next/scripts/release-checklist.test.ts
index 19264688ec..4fc38181c1 100644
--- a/web-next/scripts/release-checklist.test.ts
+++ b/web-next/scripts/release-checklist.test.ts
@@ -16,8 +16,10 @@ function releaseFiles(overrides = {}) {
scripts: {
'verify:full':
'npm run build && npm run release:budget && npm run release:compose
&& npm run release:checklist && npm run verify',
+ verify: 'npm run lint && npm run test && npm run i18n:report && npm
run route:matrix && npm run three-signal:cutoff',
'release:budget': 'node ./scripts/release-budget.mjs',
- 'release:compose': 'node ./scripts/release-compose.mjs'
+ 'release:compose': 'node ./scripts/release-compose.mjs',
+ 'three-signal:cutoff': 'node
./scripts/three-signal-alpha-cutoff-report.mjs'
}
},
workflow: 'run: npm run verify:full\nrun: npm run parity:smoke:baseline',
@@ -29,6 +31,7 @@ function releaseFiles(overrides = {}) {
gateway: `${gatewayRoutes}\nlocation ^~ /api/ {\n proxy_pass
http://hertzbeat:1157;\n}\nlocation / {\n proxy_pass http://hertzbeat:1157;\n}`,
releaseBudget: 'DEFAULT_RELEASE_BUDGET_BYTES\nevaluateReleaseBudget',
releaseCompose: 'verifyReleaseComposeConfig\nHERTZBEAT_ROLLBACK_VERSION',
+ threeSignalAlphaCutoff: 'verifyThreeSignalAlphaCutoff',
...overrides
};
}
@@ -44,7 +47,8 @@ describe('release checklist gate', () => {
'compose-version-convergence',
'promotion-rollback-config',
'bundle-budget',
- 'release-ingress-route-ownership'
+ 'release-ingress-route-ownership',
+ 'three-signal-alpha-cutoff-evidence'
]);
});
@@ -61,4 +65,24 @@ describe('release checklist gate', () => {
);
expect(() =>
verifyReleaseChecklist(files)).toThrow('release-ingress-route-ownership');
});
+
+ it('fails when the three-signal alpha cutoff evidence report is not wired
into verify', () => {
+ const files = releaseFiles({
+ packageJson: {
+ scripts: {
+ 'verify:full':
+ 'npm run build && npm run release:budget && npm run
release:compose && npm run release:checklist && npm run verify',
+ verify: 'npm run lint && npm run test && npm run i18n:report && npm
run route:matrix',
+ 'release:budget': 'node ./scripts/release-budget.mjs',
+ 'release:compose': 'node ./scripts/release-compose.mjs',
+ 'three-signal:cutoff': 'node
./scripts/three-signal-alpha-cutoff-report.mjs'
+ }
+ }
+ });
+
+ expect(evaluateReleaseChecklist(files).find(result => result.key ===
'three-signal-alpha-cutoff-evidence')?.passed).toBe(
+ false,
+ );
+ expect(() =>
verifyReleaseChecklist(files)).toThrow('three-signal-alpha-cutoff-evidence');
+ });
});
diff --git a/web-next/scripts/release-readiness-contract.test.ts
b/web-next/scripts/release-readiness-contract.test.ts
index 19828c9080..2981264f78 100644
--- a/web-next/scripts/release-readiness-contract.test.ts
+++ b/web-next/scripts/release-readiness-contract.test.ts
@@ -37,6 +37,10 @@ function readReleaseChecklistScript(): string {
return readFileSync(resolve(webNextRoot, 'scripts/release-checklist.mjs'),
'utf8');
}
+function readThreeSignalAlphaCutoffScript(): string {
+ return readFileSync(resolve(webNextRoot,
'scripts/three-signal-alpha-cutoff-report.mjs'), 'utf8');
+}
+
function readNextObservabilityGateway(): string {
return readFileSync(
resolve(repoRoot,
'script/docker-compose/hertzbeat-postgresql-victoria-metrics-next-observability/nginx/default.conf'),
@@ -133,6 +137,7 @@ describe('release-readiness validation baseline', () => {
);
expect(releaseChecklistScript).toContain('RELEASE_CHECKLIST_ITEMS');
expect(releaseChecklistScript).toContain('verifyReleaseChecklist');
+
expect(releaseChecklistScript).toContain('three-signal-alpha-cutoff-evidence');
for (const routePrefix of ['/_next/', '/overview', '/entities', '/alert',
'/topology', '/setting']) {
expect(gateway).toContain(`location ^~ ${routePrefix}`);
@@ -142,6 +147,17 @@ describe('release-readiness validation baseline', () => {
expect(gateway).toContain('proxy_pass http://hertzbeat:1157;');
});
+ it('keeps the three-signal alpha cutoff evidence report in frontend
verification', () => {
+ const packageJson = readPackageJson();
+ const releaseChecklistScript = readReleaseChecklistScript();
+ const threeSignalAlphaCutoffScript = readThreeSignalAlphaCutoffScript();
+
+ expect(packageJson.scripts?.['three-signal:cutoff']).toBe('node
./scripts/three-signal-alpha-cutoff-report.mjs');
+ expect(packageJson.scripts?.verify).toContain('npm run
three-signal:cutoff');
+ expect(releaseChecklistScript).toContain('threeSignalAlphaCutoff');
+
expect(threeSignalAlphaCutoffScript).toContain('verifyThreeSignalAlphaCutoff');
+ });
+
it('keeps the web-next release image aligned with CI Node runtime', () => {
const workflowNodeMajors = new
Set(extractWorkflowNodeMajors(readWorkflow()));
const dockerNodeMajors = new
Set(extractDockerNodeMajors(readDockerfile()));
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]