From 4b2eae3f6943773460fb237ba21269af1250d92b Mon Sep 17 00:00:00 2001 From: Yos Riady Date: Fri, 2 Oct 2026 19:02:32 +0700 Subject: [PATCH 1/2] ci: use free GitHub-hosted runners (public repo) GitHub-hosted runners cost nothing for public repositories. Blacksmith billed this repo per minute for the same jobs. Co-Authored-By: Claude Opus 5.5 (1M context) --- .github/workflows/build.yml | 8 +++----- .github/workflows/sdk-e2e.yml | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 07fe268..15de9eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,8 +15,7 @@ concurrency: jobs: changes: - # Path detection is a lightweight job; keep the larger runners for builds. - runs-on: blacksmith-2vcpu-ubuntu-2404 + runs-on: ubuntu-latest outputs: matrix: ${{ steps.set.outputs.matrix }} any: ${{ steps.set.outputs.any }} @@ -134,7 +133,7 @@ jobs: build: needs: changes if: ${{ needs.changes.outputs.any == 'true' }} - runs-on: blacksmith-4vcpu-ubuntu-2404 + runs-on: ubuntu-latest strategy: fail-fast: false matrix: ${{ fromJSON(needs.changes.outputs.matrix) }} @@ -217,8 +216,7 @@ jobs: audit: needs: changes if: ${{ needs.changes.outputs.any == 'true' }} - # Audits read lockfiles and do not compile dependencies. - runs-on: blacksmith-2vcpu-ubuntu-2404 + runs-on: ubuntu-latest strategy: fail-fast: false matrix: ${{ fromJSON(needs.changes.outputs.matrix) }} diff --git a/.github/workflows/sdk-e2e.yml b/.github/workflows/sdk-e2e.yml index cfa9c2d..c8ae413 100644 --- a/.github/workflows/sdk-e2e.yml +++ b/.github/workflows/sdk-e2e.yml @@ -25,7 +25,7 @@ concurrency: jobs: node-sweep: name: Node sweep (12 examples) - runs-on: blacksmith-4vcpu-ubuntu-2404 + runs-on: ubuntu-latest steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: @@ -72,7 +72,7 @@ jobs: browser: name: Browser over EIP-6963 (anvil) - runs-on: blacksmith-4vcpu-ubuntu-2404 + runs-on: ubuntu-latest steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: @@ -103,7 +103,7 @@ jobs: real-metamask: name: Real wallets in a browser (MetaMask, Wallet Standard) - runs-on: blacksmith-4vcpu-ubuntu-2404 + runs-on: ubuntu-latest steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: From fa65609002f02d7d5ae7b49c2b3535169c2aae64 Mon Sep 17 00:00:00 2001 From: Yos Riady Date: Fri, 2 Oct 2026 19:19:53 +0700 Subject: [PATCH 2/2] test(e2e): start Chrome with --no-sandbox in the EIP-6963 browser run GitHub-hosted Ubuntu 24.04 restricts unprivileged user namespaces, so Chrome's sandbox fails to start and the run times out at 90s. Co-Authored-By: Claude Opus 5.5 (1M context) --- e2e/browser/run.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/e2e/browser/run.mjs b/e2e/browser/run.mjs index 639c583..6c2413e 100644 --- a/e2e/browser/run.mjs +++ b/e2e/browser/run.mjs @@ -59,7 +59,11 @@ process.on("unhandledRejection", async (e) => { console.error(e); await teardown // A hung page must not hang CI: every await below is bounded by this. const deadline = setTimeout(() => { console.error("test:browser timed out after 90s"); process.exit(3); }, 90_000); deadline.unref(); -proc = spawn(chrome, ["--headless=new", "--remote-debugging-port=0", `--user-data-dir=${profile}`, "--no-first-run", "--disable-gpu", "about:blank"], { stdio: ["ignore", "ignore", "pipe"] }); +// --no-sandbox: GitHub-hosted Ubuntu 24.04 blocks the unprivileged user +// namespaces Chrome's sandbox needs, so Chrome exits before printing the +// DevTools URL and the run hangs until the deadline. Playwright (used by the +// real-wallet job) passes the same flag by default. +proc = spawn(chrome, ["--headless=new", "--no-sandbox", "--remote-debugging-port=0", `--user-data-dir=${profile}`, "--no-first-run", "--disable-gpu", "about:blank"], { stdio: ["ignore", "ignore", "pipe"] }); const wsUrl = await new Promise((resolve) => { proc.stderr.on("data", (d) => { const m = String(d).match(/ws:\/\/[^\s]+/); if (m) resolve(m[0]); }); }); ws = new WebSocket(wsUrl); await new Promise((r) => (ws.onopen = r));