diff --git a/.crabbox.yaml b/.crabbox.yaml index 1fd394524200..4e467ad5b727 100644 --- a/.crabbox.yaml +++ b/.crabbox.yaml @@ -4,11 +4,11 @@ profile: openclaw-check provider: azure class: standard capacity: - market: spot + market: on-demand strategy: most-available - # Fail closed instead of silently falling back to on-demand while the - # Azure-backed billing account is the default runner path. - fallback: spot-only + # The Azure-backed billing account carries the OpenClaw runner credits; use + # explicit on-demand capacity instead of low-priority spot, whose regional + # quota is too small for broad maintainer proof or parallel Crabbox lanes. hints: true actions: workflow: .github/workflows/crabbox-hydrate.yml @@ -49,8 +49,8 @@ aws: region: eu-west-1 rootGB: 400 azure: - # The OpenClaw Azure subscription has reliable D2 spot capacity in eastus2; - # eastus rejects the same SKUs and can stall provisioning. + # The OpenClaw Azure subscription is reliable in eastus2; eastus rejects the + # same SKUs and can stall provisioning. location: eastus2 sync: delete: true @@ -71,14 +71,16 @@ env: - OPENCLAW_* ssh: user: crabbox - port: "2222" + # Azure coordinator leases expose SSH on 22. The run wrapper can fall back + # from 2222, but `crabbox job run` hydrates via the configured port directly. + port: "22" jobs: prewarm: provider: azure target: linux class: standard - type: Standard_D2ads_v6 - market: spot + type: Standard_D4ads_v6 + market: on-demand idleTimeout: 90m hydrate: actions: true @@ -95,8 +97,8 @@ jobs: provider: azure target: linux class: standard - type: Standard_D2ads_v6 - market: spot + type: Standard_D4ads_v6 + market: on-demand idleTimeout: 90m hydrate: actions: true @@ -105,7 +107,18 @@ jobs: workflow: .github/workflows/crabbox-hydrate.yml job: hydrate ref: main - command: env OPENCLAW_CHECK_CHANGED_REMOTE_CHILD=1 OPENCLAW_CHANGED_LANES_RAW_SYNC=1 CI=1 corepack pnpm check:changed + shell: true + command: | + set -euo pipefail + if ! git status --short >/dev/null 2>&1; then + rm -rf .git + git init -q + git add -A + if ! git diff --cached --quiet; then + git -c user.name=OpenClaw -c user.email=ci@openclaw.local commit -q --no-gpg-sign -m remote-check-tree + fi + fi + env CI=1 corepack pnpm check --timed stop: always testbox-changed: provider: blacksmith-testbox diff --git a/CHANGELOG.md b/CHANGELOG.md index a03e8994a358..c817dbd78eed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,7 +57,7 @@ Docs: https://docs.openclaw.ai - Docs/CI: run Mintlify anchor checks through the repo pnpm runner so docs link validation works when pnpm is only available through the hydrated package-manager shim. - Agents: keep configured fallback model metadata typed so provider params, context-token caps, and media input limits do not break changed-gate typechecks. - Agents: accept hidden `sessions_send` body aliases before validation while keeping the model-facing `message` schema canonical. (#88229) Thanks @zhangguiping-xydt. -- CI/Crabbox: keep default runner capacity spot-only and provider-neutral so OpenClaw remote validation does not silently fall back to on-demand leases or stale AWS region hints. +- CI/Crabbox: keep default runner capacity on the Azure credit-backed on-demand D4 lane with the Azure SSH port and a Git-independent full check job, so broad validation avoids low-priority spot quota stalls, hydrate port mismatches, non-Git hydrated workspaces, and stale AWS region hints. - CI/Crabbox: route Crabbox wrapper and Testbox workflow edits to their regression tests so changed-test gates do not silently run zero specs. - CI/workflows: route workflow sanity helper edits to their guard tests and cover composite-action input interpolation checks. - CI/tooling: route CI scope, dependency, changelog, and docs helper edits to their owner tests instead of silently skipping changed-test coverage. diff --git a/test/scripts/package-acceptance-workflow.test.ts b/test/scripts/package-acceptance-workflow.test.ts index ffafc4851307..e9faf6de7a75 100644 --- a/test/scripts/package-acceptance-workflow.test.ts +++ b/test/scripts/package-acceptance-workflow.test.ts @@ -222,7 +222,7 @@ describe("package acceptance workflow", () => { ); }); - it("keeps default Crabbox capacity fail-closed and provider-neutral", () => { + it("keeps default Crabbox capacity on the Azure credit-backed lane", () => { const crabboxConfig = parse(readFileSync(CRABBOX_CONFIG, "utf8")) as { aws?: { region?: string }; capacity?: { @@ -231,15 +231,35 @@ describe("package acceptance workflow", () => { market?: string; regions?: string[]; }; + jobs?: { + changed?: { command?: string; market?: string; shell?: boolean; type?: string }; + prewarm?: { market?: string; type?: string }; + }; provider?: string; + ssh?: { port?: string; user?: string }; }; expect(crabboxConfig.provider).toBe("azure"); - expect(crabboxConfig.capacity?.market).toBe("spot"); - expect(crabboxConfig.capacity?.fallback).toBe("spot-only"); + expect(crabboxConfig.capacity?.market).toBe("on-demand"); + expect(crabboxConfig.capacity?.fallback).toBeUndefined(); expect(crabboxConfig.capacity?.regions).toBeUndefined(); expect(crabboxConfig.capacity?.availabilityZones).toBeUndefined(); expect(crabboxConfig.aws?.region).toBe("eu-west-1"); + expect(crabboxConfig.jobs?.prewarm?.market).toBe("on-demand"); + expect(crabboxConfig.jobs?.prewarm?.type).toBe("Standard_D4ads_v6"); + expect(crabboxConfig.jobs?.changed?.market).toBe("on-demand"); + expect(crabboxConfig.jobs?.changed?.type).toBe("Standard_D4ads_v6"); + expect(crabboxConfig.jobs?.changed?.shell).toBe(true); + expect(crabboxConfig.jobs?.changed?.command).toContain("set -euo pipefail"); + expect(crabboxConfig.jobs?.changed?.command).toContain("git init -q"); + expect(crabboxConfig.jobs?.changed?.command).toContain( + "commit -q --no-gpg-sign -m remote-check-tree", + ); + expect(crabboxConfig.jobs?.changed?.command).toContain( + "env CI=1 corepack pnpm check --timed", + ); + expect(crabboxConfig.ssh?.user).toBe("crabbox"); + expect(crabboxConfig.ssh?.port).toBe("22"); }); it("resolves candidate package sources before reusing Docker E2E lanes", () => {