Skip to content

Commit 885bf1c

Browse files
committed
ci: parallelize core test configs
1 parent 7f64a3c commit 885bf1c

3 files changed

Lines changed: 46 additions & 23 deletions

File tree

.github/workflows/ci.yml

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,14 +1183,14 @@ jobs:
11831183
NODE_OPTIONS: --max-old-space-size=6144
11841184
OPENCLAW_NODE_TEST_CONFIGS_JSON: ${{ toJson(matrix.configs) }}
11851185
OPENCLAW_NODE_TEST_INCLUDE_PATTERNS_JSON: ${{ toJson(matrix.includePatterns) }}
1186+
OPENCLAW_TEST_PROJECTS_PARALLEL: "2"
11861187
shell: bash
11871188
run: |
11881189
set -euo pipefail
11891190
node --input-type=module <<'EOF'
11901191
import { spawnSync } from "node:child_process";
11911192
import { writeFileSync } from "node:fs";
11921193
import { join } from "node:path";
1193-
import { resolveVitestCliEntry, resolveVitestNodeArgs } from "./scripts/run-vitest.mjs";
11941194
11951195
const configs = JSON.parse(process.env.OPENCLAW_NODE_TEST_CONFIGS_JSON ?? "[]");
11961196
if (!Array.isArray(configs) || configs.length === 0) {
@@ -1208,27 +1208,12 @@ jobs:
12081208
childEnv.OPENCLAW_VITEST_INCLUDE_FILE = includeFile;
12091209
}
12101210
1211-
for (const config of configs) {
1212-
console.error(`[test] starting ${config}`);
1213-
const result = spawnSync(
1214-
"pnpm",
1215-
[
1216-
"exec",
1217-
"node",
1218-
...resolveVitestNodeArgs(process.env),
1219-
resolveVitestCliEntry(),
1220-
"run",
1221-
"--config",
1222-
config,
1223-
],
1224-
{
1225-
env: childEnv,
1226-
stdio: "inherit",
1227-
},
1228-
);
1229-
if ((result.status ?? 1) !== 0) {
1230-
process.exit(result.status ?? 1);
1231-
}
1211+
const result = spawnSync("pnpm", ["exec", "node", "scripts/test-projects.mjs", ...configs], {
1212+
env: childEnv,
1213+
stdio: "inherit",
1214+
});
1215+
if ((result.status ?? 1) !== 0) {
1216+
process.exit(result.status ?? 1);
12321217
}
12331218
EOF
12341219

scripts/test-projects.mjs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,12 @@ async function main() {
372372
targetArgs.length === 0 &&
373373
changedTargetArgs === null &&
374374
!runSpecs.some((spec) => spec.watchMode);
375-
const isParallelShardRun = isFullSuiteRun || isFullExtensionsProjectRun(runSpecs);
375+
const isExplicitParallelMultiConfigRun =
376+
Boolean(process.env.OPENCLAW_TEST_PROJECTS_PARALLEL) &&
377+
runSpecs.length > 1 &&
378+
!runSpecs.some((spec) => spec.watchMode);
379+
const isParallelShardRun =
380+
isFullSuiteRun || isFullExtensionsProjectRun(runSpecs) || isExplicitParallelMultiConfigRun;
376381
if (isParallelShardRun) {
377382
const concurrency = resolveParallelFullSuiteConcurrency(runSpecs.length, process.env);
378383
if (concurrency > 1) {

scripts/test-projects.test-support.mjs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@ import { resolveVitestCliEntry, resolveVitestNodeArgs } from "./run-vitest.mjs";
4646
const DEFAULT_VITEST_CONFIG = "test/vitest/vitest.unit.config.ts";
4747
const AGENTS_VITEST_CONFIG = "test/vitest/vitest.agents.config.ts";
4848
const ACP_VITEST_CONFIG = "test/vitest/vitest.acp.config.ts";
49+
const AUTO_REPLY_CORE_VITEST_CONFIG = "test/vitest/vitest.auto-reply-core.config.ts";
4950
const AUTO_REPLY_VITEST_CONFIG = "test/vitest/vitest.auto-reply.config.ts";
51+
const AUTO_REPLY_REPLY_VITEST_CONFIG = "test/vitest/vitest.auto-reply-reply.config.ts";
52+
const AUTO_REPLY_TOP_LEVEL_VITEST_CONFIG = "test/vitest/vitest.auto-reply-top-level.config.ts";
5053
const BOUNDARY_VITEST_CONFIG = "test/vitest/vitest.boundary.config.ts";
5154
const BUNDLED_VITEST_CONFIG = "test/vitest/vitest.bundled.config.ts";
5255
const CHANNEL_VITEST_CONFIG = "test/vitest/vitest.channels.config.ts";
@@ -93,6 +96,10 @@ const EXTENSION_WHATSAPP_VITEST_CONFIG = "test/vitest/vitest.extension-whatsapp.
9396
const EXTENSION_ZALO_VITEST_CONFIG = "test/vitest/vitest.extension-zalo.config.ts";
9497
const EXTENSIONS_VITEST_CONFIG = "test/vitest/vitest.extensions.config.ts";
9598
const FULL_EXTENSIONS_VITEST_CONFIG = "test/vitest/vitest.full-extensions.config.ts";
99+
const GATEWAY_CLIENT_VITEST_CONFIG = "test/vitest/vitest.gateway-client.config.ts";
100+
const GATEWAY_CORE_VITEST_CONFIG = "test/vitest/vitest.gateway-core.config.ts";
101+
const GATEWAY_METHODS_VITEST_CONFIG = "test/vitest/vitest.gateway-methods.config.ts";
102+
const GATEWAY_SERVER_VITEST_CONFIG = "test/vitest/vitest.gateway-server.config.ts";
96103
const GATEWAY_VITEST_CONFIG = "test/vitest/vitest.gateway.config.ts";
97104
const HOOKS_VITEST_CONFIG = "test/vitest/vitest.hooks.config.ts";
98105
const INFRA_VITEST_CONFIG = "test/vitest/vitest.infra.config.ts";
@@ -103,6 +110,10 @@ const PLUGIN_SDK_LIGHT_VITEST_CONFIG = "test/vitest/vitest.plugin-sdk-light.conf
103110
const PLUGIN_SDK_VITEST_CONFIG = "test/vitest/vitest.plugin-sdk.config.ts";
104111
const PLUGINS_VITEST_CONFIG = "test/vitest/vitest.plugins.config.ts";
105112
const UNIT_FAST_VITEST_CONFIG = "test/vitest/vitest.unit-fast.config.ts";
113+
const UNIT_SECURITY_VITEST_CONFIG = "test/vitest/vitest.unit-security.config.ts";
114+
const UNIT_SRC_VITEST_CONFIG = "test/vitest/vitest.unit-src.config.ts";
115+
const UNIT_SUPPORT_VITEST_CONFIG = "test/vitest/vitest.unit-support.config.ts";
116+
const UNIT_UI_VITEST_CONFIG = "test/vitest/vitest.unit-ui.config.ts";
106117
const PROCESS_VITEST_CONFIG = "test/vitest/vitest.process.config.ts";
107118
const RUNTIME_CONFIG_VITEST_CONFIG = "test/vitest/vitest.runtime-config.config.ts";
108119
const SECRETS_VITEST_CONFIG = "test/vitest/vitest.secrets.config.ts";
@@ -119,6 +130,9 @@ const CHANGED_ARGS_PATTERN = /^--changed(?:=(.+))?$/u;
119130
const VITEST_CONFIG_BY_KIND = {
120131
acp: ACP_VITEST_CONFIG,
121132
agent: AGENTS_VITEST_CONFIG,
133+
autoReplyCore: AUTO_REPLY_CORE_VITEST_CONFIG,
134+
autoReplyReply: AUTO_REPLY_REPLY_VITEST_CONFIG,
135+
autoReplyTopLevel: AUTO_REPLY_TOP_LEVEL_VITEST_CONFIG,
122136
autoReply: AUTO_REPLY_VITEST_CONFIG,
123137
boundary: BOUNDARY_VITEST_CONFIG,
124138
bundled: BUNDLED_VITEST_CONFIG,
@@ -161,6 +175,10 @@ const VITEST_CONFIG_BY_KIND = {
161175
extensionVoiceCall: EXTENSION_VOICE_CALL_VITEST_CONFIG,
162176
extensionWhatsApp: EXTENSION_WHATSAPP_VITEST_CONFIG,
163177
extensionZalo: EXTENSION_ZALO_VITEST_CONFIG,
178+
gatewayClient: GATEWAY_CLIENT_VITEST_CONFIG,
179+
gatewayCore: GATEWAY_CORE_VITEST_CONFIG,
180+
gatewayMethods: GATEWAY_METHODS_VITEST_CONFIG,
181+
gatewayServer: GATEWAY_SERVER_VITEST_CONFIG,
164182
gateway: GATEWAY_VITEST_CONFIG,
165183
hooks: HOOKS_VITEST_CONFIG,
166184
infra: INFRA_VITEST_CONFIG,
@@ -172,6 +190,10 @@ const VITEST_CONFIG_BY_KIND = {
172190
pluginSdkLight: PLUGIN_SDK_LIGHT_VITEST_CONFIG,
173191
process: PROCESS_VITEST_CONFIG,
174192
unitFast: UNIT_FAST_VITEST_CONFIG,
193+
unitSecurity: UNIT_SECURITY_VITEST_CONFIG,
194+
unitSrc: UNIT_SRC_VITEST_CONFIG,
195+
unitSupport: UNIT_SUPPORT_VITEST_CONFIG,
196+
unitUi: UNIT_UI_VITEST_CONFIG,
175197
runtimeConfig: RUNTIME_CONFIG_VITEST_CONFIG,
176198
secrets: SECRETS_VITEST_CONFIG,
177199
sharedCore: SHARED_CORE_VITEST_CONFIG,
@@ -814,6 +836,10 @@ export function buildVitestRunPlans(
814836
"contractsPlugin",
815837
"bundled",
816838
"gateway",
839+
"gatewayCore",
840+
"gatewayClient",
841+
"gatewayMethods",
842+
"gatewayServer",
817843
"hooks",
818844
"infra",
819845
"runtimeConfig",
@@ -834,9 +860,16 @@ export function buildVitestRunPlans(
834860
"commandLight",
835861
"command",
836862
"autoReply",
863+
"autoReplyCore",
864+
"autoReplyReply",
865+
"autoReplyTopLevel",
837866
"agent",
838867
"plugin",
839868
"ui",
869+
"unitSrc",
870+
"unitSecurity",
871+
"unitSupport",
872+
"unitUi",
840873
"utils",
841874
"wizard",
842875
"e2e",

0 commit comments

Comments
 (0)