From f8fee34aef69132caa1286a3d021760236c7f1c2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 10 May 2026 02:54:18 +0100 Subject: [PATCH] ci(release): stabilize full validation gates --- .../openclaw-live-and-e2e-checks-reusable.yml | 4 ++++ .github/workflows/openclaw-release-checks.yml | 14 +++++++++++ src/config/types.channel-health.ts | 16 +++++++++++++ src/config/types.channel-messaging-common.ts | 2 +- src/config/types.channels.ts | 24 +++++++------------ src/config/types.discord.ts | 2 +- src/config/types.googlechat.ts | 2 +- src/config/types.imessage.ts | 2 +- src/config/types.msteams.ts | 2 +- src/config/types.slack.ts | 2 +- src/config/types.telegram.ts | 2 +- src/config/types.whatsapp.ts | 2 +- .../package-acceptance-workflow.test.ts | 15 ++++++++++++ .../plugin-prerelease-test-plan.test.ts | 4 ++++ 14 files changed, 69 insertions(+), 24 deletions(-) create mode 100644 src/config/types.channel-health.ts diff --git a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml index a5e4fd25d00..6af54572836 100644 --- a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml +++ b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml @@ -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 diff --git a/.github/workflows/openclaw-release-checks.yml b/.github/workflows/openclaw-release-checks.yml index 6feb007a4b1..1bdc868e803 100644 --- a/.github/workflows/openclaw-release-checks.yml +++ b/.github/workflows/openclaw-release-checks.yml @@ -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 diff --git a/src/config/types.channel-health.ts b/src/config/types.channel-health.ts new file mode 100644 index 00000000000..592fd54f6e6 --- /dev/null +++ b/src/config/types.channel-health.ts @@ -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; +}; diff --git a/src/config/types.channel-messaging-common.ts b/src/config/types.channel-messaging-common.ts index 1a535ba8d7d..91688c16bdb 100644 --- a/src/config/types.channel-messaging-common.ts +++ b/src/config/types.channel-messaging-common.ts @@ -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 = { diff --git a/src/config/types.channels.ts b/src/config/types.channels.ts index 9094e8b660f..0294b48b334 100644 --- a/src/config/types.channels.ts +++ b/src/config/types.channels.ts @@ -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; diff --git a/src/config/types.discord.ts b/src/config/types.discord.ts index 4f0bb693d51..ca124bd2a83 100644 --- a/src/config/types.discord.ts +++ b/src/config/types.discord.ts @@ -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"; diff --git a/src/config/types.googlechat.ts b/src/config/types.googlechat.ts index 15a5db99105..e8d17ac132e 100644 --- a/src/config/types.googlechat.ts +++ b/src/config/types.googlechat.ts @@ -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"; diff --git a/src/config/types.imessage.ts b/src/config/types.imessage.ts index 1fe00bbab43..541e66d3963 100644 --- a/src/config/types.imessage.ts +++ b/src/config/types.imessage.ts @@ -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"; diff --git a/src/config/types.msteams.ts b/src/config/types.msteams.ts index a91c9c39015..3c8ee536974 100644 --- a/src/config/types.msteams.ts +++ b/src/config/types.msteams.ts @@ -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"; diff --git a/src/config/types.slack.ts b/src/config/types.slack.ts index ca11205f5b3..5d79fbe5c7f 100644 --- a/src/config/types.slack.ts +++ b/src/config/types.slack.ts @@ -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"; diff --git a/src/config/types.telegram.ts b/src/config/types.telegram.ts index f2b0aab13bf..e03a7738e5f 100644 --- a/src/config/types.telegram.ts +++ b/src/config/types.telegram.ts @@ -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"; diff --git a/src/config/types.whatsapp.ts b/src/config/types.whatsapp.ts index 218096f1aa7..8c93b6e6e00 100644 --- a/src/config/types.whatsapp.ts +++ b/src/config/types.whatsapp.ts @@ -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"; diff --git a/test/scripts/package-acceptance-workflow.test.ts b/test/scripts/package-acceptance-workflow.test.ts index 26971fcacec..10fb721cdf7 100644 --- a/test/scripts/package-acceptance-workflow.test.ts +++ b/test/scripts/package-acceptance-workflow.test.ts @@ -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( diff --git a/test/scripts/plugin-prerelease-test-plan.test.ts b/test/scripts/plugin-prerelease-test-plan.test.ts index 167bf52d7a6..8eb68687175 100644 --- a/test/scripts/plugin-prerelease-test-plan.test.ts +++ b/test/scripts/plugin-prerelease-test-plan.test.ts @@ -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 }}",