@@ -315,12 +315,6 @@ jobs:
315315 if (runNodeFull) {
316316 checksFastCoreTasks.push(
317317 { check_name: "checks-fast-bundled-protocol", runtime: "node", task: "bundled-protocol" },
318- {
319- check_name: "QA Smoke CI",
320- runtime: "node",
321- task: "qa-smoke-ci",
322- runner: "blacksmith-16vcpu-ubuntu-2404",
323- },
324318 { check_name: "checks-fast-bun-launcher", runtime: "bun", task: "bun-launcher" },
325319 );
326320 } else {
@@ -852,7 +846,7 @@ jobs:
852846 contents : read
853847 needs : [preflight]
854848 if : ${{ !cancelled() && always() && needs.preflight.outputs.run_native_i18n == 'true' }}
855- runs-on : ${{ github.repository == 'openclaw/openclaw' && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-24.04' }}
849+ runs-on : ${{ github.event_name == 'workflow_dispatch' && 'ubuntu-24.04' || (github. repository == 'openclaw/openclaw' && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-24.04') }}
856850 timeout-minutes : 10
857851 steps :
858852 - name : Checkout
@@ -906,31 +900,6 @@ jobs:
906900 pnpm test:bundled
907901 pnpm protocol:check
908902 ;;
909- qa-smoke-ci)
910- output_dir=".artifacts/qa-e2e/smoke-ci-profile"
911- package_dir=".artifacts/qa-e2e/smoke-ci-package"
912- export OPENCLAW_BUILD_PRIVATE_QA=1
913- export OPENCLAW_ENABLE_PRIVATE_QA_CLI=1
914- export OPENCLAW_DISABLE_BUNDLED_PLUGINS=0
915- export OPENCLAW_QA_REDACT_PUBLIC_METADATA=1
916- export OPENCLAW_QA_TRANSPORT_READY_TIMEOUT_MS=180000
917- export NODE_OPTIONS=--max-old-space-size=16384
918- node scripts/package-openclaw-for-docker.mjs \
919- --output-dir "$package_dir" \
920- --output-name openclaw-current.tgz
921- export OPENCLAW_CURRENT_PACKAGE_TGZ="$PWD/$package_dir/openclaw-current.tgz"
922- qa_exit_code=0
923- pnpm openclaw qa run \
924- --repo-root . \
925- --qa-profile smoke-ci \
926- --concurrency 8 \
927- --output-dir "$output_dir" || qa_exit_code=$?
928- echo "QA smoke profile evidence: \`${output_dir}\`" >> "$GITHUB_STEP_SUMMARY"
929- if [ "$qa_exit_code" -ne 0 ]; then
930- echo "::error title=QA smoke profile failed::smoke-ci exited ${qa_exit_code}; evidence upload will still run"
931- exit "$qa_exit_code"
932- fi
933- ;;
934903 contracts-plugins-ci-routing)
935904 pnpm test:contracts:plugins
936905 pnpm test src/commands/status.scan-result.test.ts src/scripts/ci-changed-scope.test.ts test/scripts/changed-lanes.test.ts test/scripts/ci-workflow-guards.test.ts test/scripts/run-vitest.test.ts test/scripts/test-projects.test.ts
@@ -947,15 +916,111 @@ jobs:
947916 ;;
948917 esac
949918
919+ qa-smoke-ci-shard :
920+ permissions :
921+ contents : read
922+ name : QA Smoke CI (${{ matrix.name }})
923+ needs : [preflight]
924+ if : needs.preflight.outputs.run_checks_fast == 'true'
925+ runs-on : ${{ github.event_name == 'workflow_dispatch' && 'ubuntu-24.04' || (github.repository == 'openclaw/openclaw' && 'blacksmith-16vcpu-ubuntu-2404' || 'ubuntu-24.04') }}
926+ timeout-minutes : 60
927+ strategy :
928+ fail-fast : false
929+ max-parallel : 3
930+ matrix :
931+ include :
932+ - name : matrix
933+ slug : matrix
934+ - name : telegram 1/2
935+ slug : telegram-1-of-2
936+ - name : telegram 2/2
937+ slug : telegram-2-of-2
938+ steps :
939+ - *linux_node_checkout_step
940+ - name : Setup Node environment
941+ uses : ./.github/actions/setup-node-env
942+ with :
943+ install-bun : " false"
944+
945+ - name : Run smoke profile shard
946+ env :
947+ SHARD_SLUG : ${{ matrix.slug }}
948+ shell : bash
949+ run : |
950+ set -euo pipefail
951+ output_dir=".artifacts/qa-e2e/smoke-ci-profile-${SHARD_SLUG}"
952+ package_dir=".artifacts/qa-e2e/smoke-ci-package-${SHARD_SLUG}"
953+ export OPENCLAW_BUILD_PRIVATE_QA=1
954+ export OPENCLAW_ENABLE_PRIVATE_QA_CLI=1
955+ export OPENCLAW_DISABLE_BUNDLED_PLUGINS=0
956+ export OPENCLAW_QA_REDACT_PUBLIC_METADATA=1
957+ export OPENCLAW_QA_TRANSPORT_READY_TIMEOUT_MS=180000
958+ export NODE_OPTIONS=--max-old-space-size=16384
959+ node scripts/package-openclaw-for-docker.mjs \
960+ --output-dir "$package_dir" \
961+ --output-name openclaw-current.tgz
962+ export OPENCLAW_CURRENT_PACKAGE_TGZ="$PWD/$package_dir/openclaw-current.tgz"
963+ SHARD_SCENARIO_IDS_JSON="$(
964+ node --import tsx --input-type=module <<'EOF'
965+ import { createQaSmokeCiMatrix } from "./extensions/qa-lab/src/ci-smoke-plan.ts";
966+
967+ const shard = createQaSmokeCiMatrix().include.find(
968+ (candidate) => candidate.slug === process.env.SHARD_SLUG,
969+ );
970+ if (!shard) {
971+ throw new Error(`unknown QA smoke shard: ${process.env.SHARD_SLUG}`);
972+ }
973+ process.stdout.write(JSON.stringify(shard.scenario_ids));
974+ EOF
975+ )"
976+ export SHARD_SCENARIO_IDS_JSON
977+ mapfile -t scenario_ids < <(
978+ node -e 'for (const id of JSON.parse(process.env.SHARD_SCENARIO_IDS_JSON)) console.log(id)'
979+ )
980+ scenario_args=()
981+ for scenario_id in "${scenario_ids[@]}"; do
982+ scenario_args+=(--scenario "$scenario_id")
983+ done
984+ qa_exit_code=0
985+ pnpm openclaw qa run \
986+ --repo-root . \
987+ --qa-profile smoke-ci \
988+ --concurrency 8 \
989+ --output-dir "$output_dir" \
990+ "${scenario_args[@]}" || qa_exit_code=$?
991+ echo "QA smoke profile evidence: \`${output_dir}\`" >> "$GITHUB_STEP_SUMMARY"
992+ if [ "$qa_exit_code" -ne 0 ]; then
993+ echo "::error title=QA smoke profile failed::smoke-ci shard ${SHARD_SLUG} exited ${qa_exit_code}; evidence upload will still run"
994+ exit "$qa_exit_code"
995+ fi
996+
950997 - name : Upload QA smoke profile evidence
951- if : always() && matrix.task == 'qa-smoke-ci'
998+ if : always()
952999 uses : actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
9531000 with :
954- name : qa-smoke-profile-${{ github.run_id }}-${{ github.run_attempt }}
955- path : .artifacts/qa-e2e/smoke-ci-profile/
1001+ name : qa-smoke-profile-${{ matrix.slug }}-${{ github.run_id }}-${{ github.run_attempt }}
1002+ path : .artifacts/qa-e2e/smoke-ci-profile-${{ matrix.slug }} /
9561003 if-no-files-found : warn
9571004 retention-days : 7
9581005
1006+ qa-smoke-ci :
1007+ permissions :
1008+ contents : read
1009+ name : QA Smoke CI
1010+ needs : [preflight, qa-smoke-ci-shard]
1011+ if : always() && needs.preflight.outputs.run_checks_fast == 'true'
1012+ runs-on : ubuntu-24.04
1013+ timeout-minutes : 5
1014+ steps :
1015+ - name : Verify QA smoke shards
1016+ env :
1017+ QA_SMOKE_SHARDS_RESULT : ${{ needs.qa-smoke-ci-shard.result }}
1018+ run : |
1019+ if [ "$QA_SMOKE_SHARDS_RESULT" != "success" ]; then
1020+ echo "QA Smoke CI shards finished with result: $QA_SMOKE_SHARDS_RESULT" >&2
1021+ exit 1
1022+ fi
1023+
9591024 checks-fast-plugin-contracts-shard :
9601025 permissions :
9611026 contents : read
0 commit comments