@@ -614,6 +614,82 @@ source "$ROOT_DIR/scripts/lib/docker-build.sh"
|
614 | 614 | execFileSync("bash", ["-lc", script], { encoding: "utf8" }); |
615 | 615 | }); |
616 | 616 | |
| 617 | +it("normalizes zero-padded centralized Docker build retry counts", () => { |
| 618 | +const rootDir = process.cwd(); |
| 619 | +const script = ` |
| 620 | +set -euo pipefail |
| 621 | +ROOT_DIR=${shellQuote(rootDir)} |
| 622 | +export ROOT_DIR |
| 623 | +export OPENCLAW_DOCKER_BUILD_RETRIES=08 |
| 624 | + |
| 625 | +source "$ROOT_DIR/scripts/lib/docker-build.sh" |
| 626 | + |
| 627 | +[[ "$(docker_build_retry_count)" = "8" ]] |
| 628 | +`; |
| 629 | + |
| 630 | +execFileSync("bash", ["-lc", script], { encoding: "utf8" }); |
| 631 | +}); |
| 632 | + |
| 633 | +it.each([ |
| 634 | +[ |
| 635 | +"retry count", |
| 636 | +"OPENCLAW_DOCKER_BUILD_RETRIES", |
| 637 | +"2x", |
| 638 | +"invalid OPENCLAW_DOCKER_BUILD_RETRIES: 2x", |
| 639 | +], |
| 640 | +[ |
| 641 | +"heartbeat interval", |
| 642 | +"OPENCLAW_DOCKER_BUILD_HEARTBEAT_SECONDS", |
| 643 | +"soon", |
| 644 | +"invalid OPENCLAW_DOCKER_BUILD_HEARTBEAT_SECONDS: soon", |
| 645 | +], |
| 646 | +])( |
| 647 | +"rejects invalid centralized Docker build %s before invoking docker", |
| 648 | +(_label, envName, value, expectedError) => { |
| 649 | +const workDir = mkdtempSync(join(tmpdir(), "openclaw-docker-build-config-")); |
| 650 | + |
| 651 | +try { |
| 652 | +const binDir = join(workDir, "bin"); |
| 653 | +const markerPath = join(workDir, "docker-invoked"); |
| 654 | +mkdirSync(binDir); |
| 655 | +writeFileSync( |
| 656 | +join(binDir, "docker"), |
| 657 | +`#!/bin/bash |
| 658 | +printf invoked >${shellQuote(markerPath)} |
| 659 | +exit 0 |
| 660 | +`, |
| 661 | +); |
| 662 | +chmodSync(join(binDir, "docker"), 0o755); |
| 663 | +const rootDir = process.cwd(); |
| 664 | +const script = ` |
| 665 | +set -euo pipefail |
| 666 | +ROOT_DIR=${shellQuote(rootDir)} |
| 667 | +TMPDIR=${shellQuote(workDir)} |
| 668 | +export ROOT_DIR TMPDIR |
| 669 | +export PATH="$TMPDIR/bin:$PATH" |
| 670 | + |
| 671 | +source "$ROOT_DIR/scripts/lib/docker-build.sh" |
| 672 | + |
| 673 | +docker_build_run e2e-build -t demo-image . |
| 674 | +`; |
| 675 | + |
| 676 | +const result = spawnSync("bash", ["-lc", script], { |
| 677 | +encoding: "utf8", |
| 678 | +env: { |
| 679 | + ...process.env, |
| 680 | +[envName]: value, |
| 681 | +}, |
| 682 | +}); |
| 683 | + |
| 684 | +expect(result.status).toBe(2); |
| 685 | +expect(result.stderr).toContain(expectedError); |
| 686 | +expect(existsSync(markerPath)).toBe(false); |
| 687 | +} finally { |
| 688 | +rmSync(workDir, { recursive: true, force: true }); |
| 689 | +} |
| 690 | +}, |
| 691 | +); |
| 692 | + |
617 | 693 | it("fails centralized Docker builds fast when timeout is unavailable", () => { |
618 | 694 | const workDir = mkdtempSync(join(tmpdir(), "openclaw-docker-build-timeout-required-")); |
619 | 695 | |
|