From b90f29d3133336bb896d7ccdb096f998da4ef635 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 28 Apr 2026 00:48:52 +0100 Subject: [PATCH] ci: split native live release shards --- .agents/skills/openclaw-testing/SKILL.md | 11 +++- .../openclaw-live-and-e2e-checks-reusable.yml | 66 +++++++++++++++++-- docs/ci.md | 14 ++-- scripts/test-live-shard.mjs | 51 +++++++++++++- 4 files changed, 129 insertions(+), 13 deletions(-) diff --git a/.agents/skills/openclaw-testing/SKILL.md b/.agents/skills/openclaw-testing/SKILL.md index 5d178d3ece4..27e64269af4 100644 --- a/.agents/skills/openclaw-testing/SKILL.md +++ b/.agents/skills/openclaw-testing/SKILL.md @@ -275,16 +275,25 @@ job: - `native-live-src-agents` - `native-live-src-gateway-core` +- `native-live-src-gateway-profiles` (release CI runs this with provider + filters such as `OPENCLAW_LIVE_GATEWAY_PROVIDERS=anthropic`) - `native-live-src-gateway-backends` - `native-live-test` - `native-live-extensions-a-k` - `native-live-extensions-l-n` - `native-live-extensions-openai` - `native-live-extensions-o-z` +- `native-live-extensions-o-z-other` +- `native-live-extensions-xai` - `native-live-extensions-media` +- `native-live-extensions-media-audio` +- `native-live-extensions-media-music` +- `native-live-extensions-media-video` Use `node scripts/test-live-shard.mjs --list` to see the exact files -before rerunning a failed native live shard. +before rerunning a failed native live shard. The aggregate `o-z` and `media` +shards remain useful locally; release CI uses the smaller provider/media shards +so one live-provider flake does not force a broad native live rerun. For model-list or provider-selection fixes, use `live_models_only=true` plus the specific `live_model_providers` allowlist. Confirm logs show the expected diff --git a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml index 3eb8ecb2c71..e530834a2f6 100644 --- a/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml +++ b/.github/workflows/openclaw-live-and-e2e-checks-reusable.yml @@ -1491,6 +1491,42 @@ jobs: timeout_minutes: 90 needs_ffmpeg: false profile_env_only: false + - suite_id: native-live-src-gateway-profiles-anthropic + label: Native live gateway profiles Anthropic + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=anthropic node scripts/test-live-shard.mjs native-live-src-gateway-profiles + timeout_minutes: 90 + needs_ffmpeg: false + profile_env_only: false + - suite_id: native-live-src-gateway-profiles-google + label: Native live gateway profiles Google + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=google node scripts/test-live-shard.mjs native-live-src-gateway-profiles + timeout_minutes: 90 + needs_ffmpeg: false + profile_env_only: false + - suite_id: native-live-src-gateway-profiles-minimax + label: Native live gateway profiles MiniMax + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=minimax,minimax-portal node scripts/test-live-shard.mjs native-live-src-gateway-profiles + timeout_minutes: 90 + needs_ffmpeg: false + profile_env_only: false + - suite_id: native-live-src-gateway-profiles-openai + label: Native live gateway profiles OpenAI + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=openai node scripts/test-live-shard.mjs native-live-src-gateway-profiles + timeout_minutes: 90 + needs_ffmpeg: false + profile_env_only: false + - suite_id: native-live-src-gateway-profiles-fireworks + label: Native live gateway profiles Fireworks + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=fireworks node scripts/test-live-shard.mjs native-live-src-gateway-profiles + timeout_minutes: 90 + needs_ffmpeg: false + profile_env_only: false + - suite_id: native-live-src-gateway-profiles-other + label: Native live gateway profiles other providers + command: OPENCLAW_LIVE_GATEWAY_PROVIDERS=deepseek,opencode-go,openrouter,xai,zai node scripts/test-live-shard.mjs native-live-src-gateway-profiles + timeout_minutes: 90 + needs_ffmpeg: false + profile_env_only: false - suite_id: native-live-src-gateway-backends label: Native live gateway backends command: node scripts/test-live-shard.mjs native-live-src-gateway-backends @@ -1521,15 +1557,33 @@ jobs: timeout_minutes: 90 needs_ffmpeg: false profile_env_only: false - - suite_id: native-live-extensions-o-z - label: Native live plugins O-Z - command: node scripts/test-live-shard.mjs native-live-extensions-o-z + - suite_id: native-live-extensions-o-z-other + label: Native live plugins O-Z other + command: node scripts/test-live-shard.mjs native-live-extensions-o-z-other timeout_minutes: 90 needs_ffmpeg: false profile_env_only: false - - suite_id: native-live-extensions-media - label: Native live media plugins - command: node scripts/test-live-shard.mjs native-live-extensions-media + - suite_id: native-live-extensions-xai + label: Native live xAI plugin + command: node scripts/test-live-shard.mjs native-live-extensions-xai + timeout_minutes: 90 + needs_ffmpeg: false + profile_env_only: false + - suite_id: native-live-extensions-media-audio + label: Native live media audio plugins + command: node scripts/test-live-shard.mjs native-live-extensions-media-audio + timeout_minutes: 90 + needs_ffmpeg: false + profile_env_only: false + - suite_id: native-live-extensions-media-music + label: Native live media music plugins + command: node scripts/test-live-shard.mjs native-live-extensions-media-music + timeout_minutes: 90 + needs_ffmpeg: true + profile_env_only: false + - suite_id: native-live-extensions-media-video + label: Native live media video plugins + command: node scripts/test-live-shard.mjs native-live-extensions-media-video timeout_minutes: 90 needs_ffmpeg: true profile_env_only: false diff --git a/docs/ci.md b/docs/ci.md index ad1948096d0..58cdb0695e5 100644 --- a/docs/ci.md +++ b/docs/ci.md @@ -28,13 +28,17 @@ release box rerun bounded after a focused fix. The release live/E2E child keeps broad native `pnpm test:live` coverage, but it runs it as named shards (`native-live-src-agents`, -`native-live-src-gateway-core`, `native-live-src-gateway-backends`, -`native-live-test`, `native-live-extensions-a-k`, -`native-live-extensions-l-n`, `native-live-extensions-openai`, -`native-live-extensions-o-z`, and `native-live-extensions-media`) through +`native-live-src-gateway-core`, provider-filtered +`native-live-src-gateway-profiles` jobs, +`native-live-src-gateway-backends`, `native-live-test`, +`native-live-extensions-a-k`, `native-live-extensions-l-n`, +`native-live-extensions-openai`, `native-live-extensions-o-z-other`, +`native-live-extensions-xai`, and split media audio/music/video shards) through `scripts/test-live-shard.mjs` instead of one serial job. That keeps the same file coverage while making slow live provider failures easier to rerun and -diagnose. +diagnose. The aggregate `native-live-extensions-o-z` and +`native-live-extensions-media` shard names remain valid for manual one-shot +reruns. `Package Acceptance` is the side-run workflow for validating a package artifact without blocking the release workflow. It resolves one candidate from a diff --git a/scripts/test-live-shard.mjs b/scripts/test-live-shard.mjs index 52de43261ac..e6e418af0c6 100644 --- a/scripts/test-live-shard.mjs +++ b/scripts/test-live-shard.mjs @@ -9,13 +9,19 @@ const LIVE_TEST_SUFFIX = ".live.test.ts"; export const LIVE_TEST_SHARDS = Object.freeze([ "native-live-src-agents", "native-live-src-gateway-core", + "native-live-src-gateway-profiles", "native-live-src-gateway-backends", "native-live-test", "native-live-extensions-a-k", "native-live-extensions-l-n", "native-live-extensions-openai", "native-live-extensions-o-z", + "native-live-extensions-o-z-other", + "native-live-extensions-xai", "native-live-extensions-media", + "native-live-extensions-media-audio", + "native-live-extensions-media-music", + "native-live-extensions-media-video", ]); function walkFiles(rootDir) { @@ -83,6 +89,10 @@ function isGatewayBackendLiveTest(file) { ); } +function isGatewayProfilesLiveTest(file) { + return file === "src/gateway/gateway-models.profiles.live.test.ts"; +} + function isExtensionMediaLiveTest(file) { return ( file === "extensions/music-generation-providers.live.test.ts" || @@ -94,6 +104,26 @@ function isExtensionMediaLiveTest(file) { ); } +function isExtensionMediaMusicLiveTest(file) { + return file === "extensions/music-generation-providers.live.test.ts"; +} + +function isExtensionMediaVideoLiveTest(file) { + return file === "extensions/video-generation-providers.live.test.ts"; +} + +function isExtensionMediaAudioLiveTest(file) { + return ( + isExtensionMediaLiveTest(file) && + !isExtensionMediaMusicLiveTest(file) && + !isExtensionMediaVideoLiveTest(file) + ); +} + +function isXaiLiveTest(file) { + return file.startsWith("extensions/xai/"); +} + export function selectLiveShardFiles(shard, files = collectAllLiveTestFiles()) { switch (shard) { case "native-live-src-agents": @@ -106,8 +136,11 @@ export function selectLiveShardFiles(shard, files = collectAllLiveTestFiles()) { return files.filter( (file) => (file.startsWith("src/gateway/") || file.startsWith("src/crestodian/")) && - !isGatewayBackendLiveTest(file), + !isGatewayBackendLiveTest(file) && + !isGatewayProfilesLiveTest(file), ); + case "native-live-src-gateway-profiles": + return files.filter(isGatewayProfilesLiveTest); case "native-live-src-gateway-backends": return files.filter(isGatewayBackendLiveTest); case "native-live-test": @@ -132,8 +165,24 @@ export function selectLiveShardFiles(shard, files = collectAllLiveTestFiles()) { !file.startsWith("extensions/openai/") && !isExtensionMediaLiveTest(file), ); + case "native-live-extensions-o-z-other": + return files.filter( + (file) => + isExtensionInRange(file, "o", "z") && + !file.startsWith("extensions/openai/") && + !isExtensionMediaLiveTest(file) && + !isXaiLiveTest(file), + ); + case "native-live-extensions-xai": + return files.filter(isXaiLiveTest); case "native-live-extensions-media": return files.filter(isExtensionMediaLiveTest); + case "native-live-extensions-media-audio": + return files.filter(isExtensionMediaAudioLiveTest); + case "native-live-extensions-media-music": + return files.filter(isExtensionMediaMusicLiveTest); + case "native-live-extensions-media-video": + return files.filter(isExtensionMediaVideoLiveTest); case "native-live-extensions-l-z": return files.filter((file) => isExtensionInRange(file, "l", "z")); default: