ci(release): stabilize full validation gates

This commit is contained in:
Peter Steinberger
2026-05-10 02:54:18 +01:00
parent 7bb2712dc6
commit f8fee34aef
14 changed files with 69 additions and 24 deletions

View File

@@ -523,6 +523,8 @@ jobs:
install-bun: "true"
- name: Build dist for repo E2E
env:
NODE_OPTIONS: --max-old-space-size=6144
run: pnpm build
- name: Run repo E2E suite
@@ -568,6 +570,8 @@ jobs:
(inputs.include_live_suites && matrix.requires_live_suites)
) &&
(inputs.live_suite_filter == '' || inputs.live_suite_filter == matrix.suite_id)
env:
NODE_OPTIONS: --max-old-space-size=6144
run: pnpm build
- name: Configure suite-specific env

View File

@@ -693,6 +693,8 @@ jobs:
install-bun: "true"
- name: Build private QA runtime
env:
NODE_OPTIONS: --max-old-space-size=6144
run: pnpm build
- name: Run parity lane
@@ -770,6 +772,8 @@ jobs:
merge-multiple: true
- name: Build private QA runtime
env:
NODE_OPTIONS: --max-old-space-size=6144
run: pnpm build
- name: Generate parity report
@@ -821,6 +825,8 @@ jobs:
install-bun: "true"
- name: Build private QA runtime
env:
NODE_OPTIONS: --max-old-space-size=6144
run: pnpm build
- name: Run Matrix live lane
@@ -918,6 +924,8 @@ jobs:
require_var OPENCLAW_QA_CONVEX_SECRET_CI
- name: Build private QA runtime
env:
NODE_OPTIONS: --max-old-space-size=6144
run: pnpm build
- name: Run Telegram live lane
@@ -1012,6 +1020,8 @@ jobs:
require_var OPENCLAW_QA_CONVEX_SECRET_CI
- name: Build private QA runtime
env:
NODE_OPTIONS: --max-old-space-size=6144
run: pnpm build
- name: Run Discord live lane
@@ -1106,6 +1116,8 @@ jobs:
require_var OPENCLAW_QA_CONVEX_SECRET_CI
- name: Build private QA runtime
env:
NODE_OPTIONS: --max-old-space-size=6144
run: pnpm build
- name: Run WhatsApp live lane
@@ -1200,6 +1212,8 @@ jobs:
require_var OPENCLAW_QA_CONVEX_SECRET_CI
- name: Build private QA runtime
env:
NODE_OPTIONS: --max-old-space-size=6144
run: pnpm build
- name: Run Slack live lane

View File

@@ -0,0 +1,16 @@
export type ChannelHeartbeatVisibilityConfig = {
/** Show HEARTBEAT_OK acknowledgments in chat (default: false). */
showOk?: boolean;
/** Show heartbeat alerts with actual content (default: true). */
showAlerts?: boolean;
/** Emit indicator events for UI status display (default: true). */
useIndicator?: boolean;
};
export type ChannelHealthMonitorConfig = {
/**
* Enable channel-health-monitor restarts for this channel or account.
* Inherits the global gateway setting when omitted.
*/
enabled?: boolean;
};

View File

@@ -8,7 +8,7 @@ import type {
import type {
ChannelHealthMonitorConfig,
ChannelHeartbeatVisibilityConfig,
} from "./types.channels.js";
} from "./types.channel-health.js";
import type { DmConfig } from "./types.messages.js";
export type CommonChannelMessagingConfig = {

View File

@@ -1,4 +1,8 @@
import type { ContextVisibilityMode, GroupPolicy } from "./types.base.js";
import type {
ChannelHealthMonitorConfig,
ChannelHeartbeatVisibilityConfig,
} from "./types.channel-health.js";
import type { DiscordConfig } from "./types.discord.js";
import type { GoogleChatConfig } from "./types.googlechat.js";
import type { IMessageConfig } from "./types.imessage.js";
@@ -9,22 +13,10 @@ import type { SlackConfig } from "./types.slack.js";
import type { TelegramConfig } from "./types.telegram.js";
import type { WhatsAppConfig } from "./types.whatsapp.js";
export type ChannelHeartbeatVisibilityConfig = {
/** Show HEARTBEAT_OK acknowledgments in chat (default: false). */
showOk?: boolean;
/** Show heartbeat alerts with actual content (default: true). */
showAlerts?: boolean;
/** Emit indicator events for UI status display (default: true). */
useIndicator?: boolean;
};
export type ChannelHealthMonitorConfig = {
/**
* Enable channel-health-monitor restarts for this channel or account.
* Inherits the global gateway setting when omitted.
*/
enabled?: boolean;
};
export type {
ChannelHealthMonitorConfig,
ChannelHeartbeatVisibilityConfig,
} from "./types.channel-health.js";
export type ChannelDefaultsConfig = {
groupPolicy?: GroupPolicy;

View File

@@ -10,7 +10,7 @@ import type {
import type {
ChannelHealthMonitorConfig,
ChannelHeartbeatVisibilityConfig,
} from "./types.channels.js";
} from "./types.channel-health.js";
import type { DmConfig, ProviderCommandsConfig } from "./types.messages.js";
import type { SecretInput } from "./types.secrets.js";
import type { GroupToolPolicyBySenderConfig, GroupToolPolicyConfig } from "./types.tools.js";

View File

@@ -4,7 +4,7 @@ import type {
GroupPolicy,
ReplyToMode,
} from "./types.base.js";
import type { ChannelHealthMonitorConfig } from "./types.channels.js";
import type { ChannelHealthMonitorConfig } from "./types.channel-health.js";
import type { DmConfig } from "./types.messages.js";
import type { SecretRef } from "./types.secrets.js";

View File

@@ -8,7 +8,7 @@ import type {
import type {
ChannelHealthMonitorConfig,
ChannelHeartbeatVisibilityConfig,
} from "./types.channels.js";
} from "./types.channel-health.js";
import type { DmConfig } from "./types.messages.js";
import type { GroupToolPolicyBySenderConfig, GroupToolPolicyConfig } from "./types.tools.js";

View File

@@ -9,7 +9,7 @@ import type {
import type {
ChannelHealthMonitorConfig,
ChannelHeartbeatVisibilityConfig,
} from "./types.channels.js";
} from "./types.channel-health.js";
import type { DmConfig } from "./types.messages.js";
import type { SecretInput } from "./types.secrets.js";
import type { GroupToolPolicyBySenderConfig, GroupToolPolicyConfig } from "./types.tools.js";

View File

@@ -9,7 +9,7 @@ import type {
import type {
ChannelHealthMonitorConfig,
ChannelHeartbeatVisibilityConfig,
} from "./types.channels.js";
} from "./types.channel-health.js";
import type { DmConfig, ProviderCommandsConfig } from "./types.messages.js";
import type { GroupToolPolicyBySenderConfig, GroupToolPolicyConfig } from "./types.tools.js";

View File

@@ -11,7 +11,7 @@ import type {
import type {
ChannelHealthMonitorConfig,
ChannelHeartbeatVisibilityConfig,
} from "./types.channels.js";
} from "./types.channel-health.js";
import type { DmConfig, ProviderCommandsConfig } from "./types.messages.js";
import type { GroupToolPolicyBySenderConfig, GroupToolPolicyConfig } from "./types.tools.js";

View File

@@ -10,7 +10,7 @@ import type {
import type {
ChannelHealthMonitorConfig,
ChannelHeartbeatVisibilityConfig,
} from "./types.channels.js";
} from "./types.channel-health.js";
import type { DmConfig } from "./types.messages.js";
import type { GroupToolPolicyBySenderConfig, GroupToolPolicyConfig } from "./types.tools.js";

View File

@@ -649,6 +649,21 @@ describe("package artifact reuse", () => {
expect(workflow).not.toContain("npm_telegram:");
});
it("gives release build steps enough Node heap", () => {
for (const workflowPath of [LIVE_E2E_WORKFLOW, RELEASE_CHECKS_WORKFLOW]) {
const jobs = readWorkflow(workflowPath).jobs ?? {};
for (const [jobName, job] of Object.entries(jobs)) {
for (const step of job.steps ?? []) {
if (step.run === "pnpm build") {
expect(step.env, `${workflowPath}:${jobName}:${step.name}`).toMatchObject({
NODE_OPTIONS: "--max-old-space-size=6144",
});
}
}
}
}
});
it("runs full release children from the trusted workflow ref", () => {
const workflow = readFileSync(FULL_RELEASE_VALIDATION_WORKFLOW, "utf8");
const preparePackageJob = workflowJob(

View File

@@ -216,6 +216,9 @@ describe("scripts/lib/plugin-prerelease-test-plan.mjs", () => {
const pluginPrereleaseScript = releaseWorkflow.jobs.plugin_prerelease.steps.find(
(step) => step.name === "Dispatch and monitor plugin prerelease",
).run;
const buildDistStep = workflow.jobs["build-artifacts"].steps.find(
(step) => step.name === "Build dist",
);
expect(workflow.jobs["plugin-prerelease-static-shard"]).toBeUndefined();
expect(workflow.jobs["plugin-prerelease-docker-suite"]).toBeUndefined();
@@ -223,6 +226,7 @@ describe("scripts/lib/plugin-prerelease-test-plan.mjs", () => {
expect(workflow.jobs["checks-node-extensions-shard"]).toBeUndefined();
expect(preflight.outputs).not.toHaveProperty("run_plugin_prerelease_suite");
expect(preflight.outputs).not.toHaveProperty("run_checks_node_extensions");
expect(buildDistStep.env).toEqual({ NODE_OPTIONS: "--max-old-space-size=6144" });
expect(staticShard).toEqual({
if: "needs.preflight.outputs.run_plugin_prerelease_static == 'true'",
name: "${{ matrix.check_name }}",