mirror of
https://github.com/openclaw/openclaw.git
synced 2026-06-06 05:51:15 +08:00
ci: split agents core test shard
This commit is contained in:
@@ -172,6 +172,92 @@ function createAgenticCommandSplitShards() {
|
||||
.filter((shard) => shard.includePatterns.length > 0);
|
||||
}
|
||||
|
||||
function resolveAgentCoreShardName(file) {
|
||||
const name = relative("src/agents", file).replaceAll("\\", "/");
|
||||
if (
|
||||
name.startsWith("auth") ||
|
||||
name.includes("auth") ||
|
||||
name.includes("oauth") ||
|
||||
name.includes("credential") ||
|
||||
name.includes("api-key") ||
|
||||
name.includes("token")
|
||||
) {
|
||||
return "agentic-agents-core-auth";
|
||||
}
|
||||
if (
|
||||
name.startsWith("model") ||
|
||||
name.includes("provider") ||
|
||||
name.includes("openai") ||
|
||||
name.includes("anthropic") ||
|
||||
name.includes("gemini") ||
|
||||
name.includes("moonshot") ||
|
||||
name.includes("minimax") ||
|
||||
name.includes("xai") ||
|
||||
name.includes("zai") ||
|
||||
name.includes("chutes") ||
|
||||
name.includes("catalog")
|
||||
) {
|
||||
return "agentic-agents-core-models";
|
||||
}
|
||||
if (
|
||||
name.startsWith("agent-tools") ||
|
||||
name.startsWith("openclaw-tools") ||
|
||||
name.startsWith("bash-tools") ||
|
||||
name.startsWith("tool") ||
|
||||
name.startsWith("apply-patch") ||
|
||||
name.startsWith("exec") ||
|
||||
name.startsWith("sandbox")
|
||||
) {
|
||||
return "agentic-agents-core-tools";
|
||||
}
|
||||
if (
|
||||
name.startsWith("subagent") ||
|
||||
name.startsWith("spawn") ||
|
||||
name.startsWith("embedded-agent-subscribe")
|
||||
) {
|
||||
return "agentic-agents-core-subagents";
|
||||
}
|
||||
if (
|
||||
name.startsWith("embedded-agent-runner") ||
|
||||
name.startsWith("cli-runner") ||
|
||||
name.startsWith("agent-command") ||
|
||||
name.startsWith("command") ||
|
||||
name.includes("compaction") ||
|
||||
name.includes("session")
|
||||
) {
|
||||
return "agentic-agents-core-runner";
|
||||
}
|
||||
return "agentic-agents-core-runtime";
|
||||
}
|
||||
|
||||
function createAgentCoreSplitShards() {
|
||||
const groups = new Map();
|
||||
for (const file of listTestFiles("src/agents")) {
|
||||
const name = relative("src/agents", file).replaceAll("\\", "/");
|
||||
if (name.includes("/")) {
|
||||
continue;
|
||||
}
|
||||
const shardName = resolveAgentCoreShardName(file);
|
||||
groups.set(shardName, [...(groups.get(shardName) ?? []), file]);
|
||||
}
|
||||
|
||||
return [
|
||||
"agentic-agents-core-auth",
|
||||
"agentic-agents-core-models",
|
||||
"agentic-agents-core-tools",
|
||||
"agentic-agents-core-subagents",
|
||||
"agentic-agents-core-runner",
|
||||
"agentic-agents-core-runtime",
|
||||
]
|
||||
.map((shardName) => ({
|
||||
configs: ["test/vitest/vitest.agents-core.config.ts"],
|
||||
includePatterns: groups.get(shardName) ?? [],
|
||||
requiresDist: false,
|
||||
shardName,
|
||||
}))
|
||||
.filter((shard) => shard.includePatterns.length > 0);
|
||||
}
|
||||
|
||||
const GATEWAY_SERVER_BACKED_HTTP_TESTS = new Set([
|
||||
"src/gateway/embeddings-http.test.ts",
|
||||
"src/gateway/models-http.test.ts",
|
||||
@@ -699,11 +785,7 @@ const SPLIT_NODE_SHARDS = new Map([
|
||||
requiresDist: false,
|
||||
},
|
||||
...createAgenticCommandSplitShards(),
|
||||
{
|
||||
shardName: "agentic-agents-core",
|
||||
configs: ["test/vitest/vitest.agents-core.config.ts"],
|
||||
requiresDist: false,
|
||||
},
|
||||
...createAgentCoreSplitShards(),
|
||||
{
|
||||
shardName: "agentic-agents-embedded",
|
||||
configs: ["test/vitest/vitest.agents-embedded-agent.config.ts"],
|
||||
|
||||
@@ -591,11 +591,52 @@ describe("scripts/lib/ci-node-test-plan.mjs", () => {
|
||||
expect(new Set(commandShardFiles).size).toBe(commandShardFiles.length);
|
||||
expect(agentShards).toEqual([
|
||||
{
|
||||
checkName: "checks-node-agentic-agents-core",
|
||||
checkName: "checks-node-agentic-agents-core-auth",
|
||||
configs: ["test/vitest/vitest.agents-core.config.ts"],
|
||||
includePatterns: agentShards[0]?.includePatterns,
|
||||
requiresDist: false,
|
||||
runner: DEFAULT_NODE_TEST_RUNNER,
|
||||
shardName: "agentic-agents-core",
|
||||
shardName: "agentic-agents-core-auth",
|
||||
},
|
||||
{
|
||||
checkName: "checks-node-agentic-agents-core-models",
|
||||
configs: ["test/vitest/vitest.agents-core.config.ts"],
|
||||
includePatterns: agentShards[1]?.includePatterns,
|
||||
requiresDist: false,
|
||||
runner: DEFAULT_NODE_TEST_RUNNER,
|
||||
shardName: "agentic-agents-core-models",
|
||||
},
|
||||
{
|
||||
checkName: "checks-node-agentic-agents-core-tools",
|
||||
configs: ["test/vitest/vitest.agents-core.config.ts"],
|
||||
includePatterns: agentShards[2]?.includePatterns,
|
||||
requiresDist: false,
|
||||
runner: DEFAULT_NODE_TEST_RUNNER,
|
||||
shardName: "agentic-agents-core-tools",
|
||||
},
|
||||
{
|
||||
checkName: "checks-node-agentic-agents-core-subagents",
|
||||
configs: ["test/vitest/vitest.agents-core.config.ts"],
|
||||
includePatterns: agentShards[3]?.includePatterns,
|
||||
requiresDist: false,
|
||||
runner: DEFAULT_NODE_TEST_RUNNER,
|
||||
shardName: "agentic-agents-core-subagents",
|
||||
},
|
||||
{
|
||||
checkName: "checks-node-agentic-agents-core-runner",
|
||||
configs: ["test/vitest/vitest.agents-core.config.ts"],
|
||||
includePatterns: agentShards[4]?.includePatterns,
|
||||
requiresDist: false,
|
||||
runner: DEFAULT_NODE_TEST_RUNNER,
|
||||
shardName: "agentic-agents-core-runner",
|
||||
},
|
||||
{
|
||||
checkName: "checks-node-agentic-agents-core-runtime",
|
||||
configs: ["test/vitest/vitest.agents-core.config.ts"],
|
||||
includePatterns: agentShards[5]?.includePatterns,
|
||||
requiresDist: false,
|
||||
runner: DEFAULT_NODE_TEST_RUNNER,
|
||||
shardName: "agentic-agents-core-runtime",
|
||||
},
|
||||
{
|
||||
checkName: "checks-node-agentic-agents-embedded",
|
||||
@@ -675,6 +716,19 @@ describe("scripts/lib/ci-node-test-plan.mjs", () => {
|
||||
);
|
||||
});
|
||||
|
||||
it("covers every flat agents-core test exactly once across split shards", () => {
|
||||
const actual = createNodeTestShards()
|
||||
.filter((shard) => shard.shardName.startsWith("agentic-agents-core-"))
|
||||
.flatMap((shard) => shard.includePatterns ?? [])
|
||||
.toSorted((a, b) => a.localeCompare(b));
|
||||
const expected = listTestFiles("src/agents")
|
||||
.filter((file) => !relative("src/agents", file).includes("/"))
|
||||
.toSorted((a, b) => a.localeCompare(b));
|
||||
|
||||
expect(actual).toEqual(expected);
|
||||
expect(new Set(actual).size).toBe(actual.length);
|
||||
});
|
||||
|
||||
it("keeps expensive plugin shards release-only when normal CI asks for the cheaper plan", () => {
|
||||
const shards = createNodeTestShards({ includeReleaseOnlyPluginShards: false });
|
||||
const shardNames = shards.map((shard) => shard.shardName);
|
||||
|
||||
Reference in New Issue
Block a user