ci: split agents core test shard

This commit is contained in:
Peter Steinberger
2026-05-31 15:34:48 -04:00
parent 6b2cb4db67
commit b4a6244ef4
2 changed files with 143 additions and 7 deletions

View File

@@ -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"],

View File

@@ -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);