Skip to content
68 linesCodeBlameRaw

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

Checkout tries a failed fetch twice more, after 2 s and 5 s1// node --test scripts/runner-release.test.mjs
2import assert from "node:assert/strict";
3import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
4import { tmpdir } from "node:os";
5import { join } from "node:path";
6import { test } from "node:test";
7import { createPrivateKey } from "node:crypto";
8
9import { TARGETS, keygen, manifest, sha256, signBytes, verifyBytes, version } from "./runner-release.mjs";
Merge the runner sandbox: g1t-runner sandbox up makes a person's own computer a self-hosted runner that nothing a job runs can get out of. Linux jobs run in a Linux VM of the runner's own (a WSL 2 distribution with no host mounts, interop or Docker socket on Windows; vfkit on macOS; Sysbox, or QEMU and KVM, on Linux), each in a fresh container under Sysbox inside it; on Windows 11 Pro and up, Windows jobs each run in a Windows Sandbox discarded after the job. Runners report their isolation, and the Runners page shows it.10import { sandboxFiles, section } from "./sandbox-image.mjs";
Checkout tries a failed fetch twice more, after 2 s and 5 s11
12test("a release is signed with the private key and checked with the raw public key", () => {
13 const keys = keygen();
14 assert.equal(Buffer.from(keys.public, "base64").length, 32);
15 const key = createPrivateKey({ key: Buffer.from(keys.private, "base64"), format: "der", type: "pkcs8" });
16 const bytes = Buffer.from('{"version":"0.2.0","files":{}}');
17 const signature = signBytes(bytes, key);
18 assert.equal(Buffer.from(signature, "base64").length, 64);
19 assert.ok(verifyBytes(bytes, signature, keys.public));
20 assert.ok(!verifyBytes(Buffer.from('{"version":"9.9.9","files":{}}'), signature, keys.public));
21 assert.ok(!verifyBytes(bytes, signature, keygen().public));
22});
23
24test("the manifest names each binary that was built, with its SHA-256", () => {
25 const dir = mkdtempSync(join(tmpdir(), "runner-release-"));
26 try {
27 writeFileSync(join(dir, TARGETS["linux-x64"].file), "linux");
28 writeFileSync(join(dir, TARGETS["windows-x64"].file), "windows");
The runner no longer runs g1t's own agents. Cloud and self-hosted runners now do what a forge's runner does: Actions jobs, required checks, merge checks and merge-queue test runs, deployments, dependency bumps and backups. Everything that started Claude Code in a sandbox on an issue or pull request is gone, with its prompts, model access, mentions, delegation, plans, reviews, revisions and the workspace agents' computers.29 const m = manifest(dir, "0.2.0");
Checkout tries a failed fetch twice more, after 2 s and 5 s30 assert.equal(m.version, "0.2.0");
The runner no longer runs g1t's own agents. Cloud and self-hosted runners now do what a forge's runner does: Actions jobs, required checks, merge checks and merge-queue test runs, deployments, dependency bumps and backups. Everything that started Claude Code in a sandbox on an issue or pull request is gone, with its prompts, model access, mentions, delegation, plans, reviews, revisions and the workspace agents' computers.31 assert.equal("agent_image" in m, false);
Checkout tries a failed fetch twice more, after 2 s and 5 s32 assert.deepEqual(Object.keys(m.files).sort(), ["linux-x64", "windows-x64"]);
33 assert.equal(m.files["linux-x64"].sha256, sha256(Buffer.from("linux")));
34 assert.equal(m.files["windows-x64"].name, "g1t-runner-windows-x64.exe");
35 } finally {
36 rmSync(dir, { recursive: true, force: true });
37 }
38});
39
40test("platforms are named as the runner names them", () => {
41 assert.deepEqual(Object.keys(TARGETS).sort(), ["linux-arm64", "linux-x64", "macos-arm64", "macos-x64", "windows-x64"]);
42 assert.match(version(), /^\d+\.\d+\.\d+/);
43});
Merge the runner sandbox: g1t-runner sandbox up makes a person's own computer a self-hosted runner that nothing a job runs can get out of. Linux jobs run in a Linux VM of the runner's own (a WSL 2 distribution with no host mounts, interop or Docker socket on Windows; vfkit on macOS; Sysbox, or QEMU and KVM, on Linux), each in a fresh container under Sysbox inside it; on Windows 11 Pro and up, Windows jobs each run in a Windows Sandbox discarded after the job. Runners report their isolation, and the Runners page shows it.44
45test("the sandbox's images join the signed manifest, and one that is missing is refused", async () => {
46 const dir = mkdtempSync(join(tmpdir(), "runner-release-sandbox-"));
47 try {
48 writeFileSync(join(dir, TARGETS["linux-x64"].file), "linux");
49 writeFileSync(join(dir, sandboxFiles("x64")["wsl-x64"]), "rootfs");
50 const s = await section(dir, "g1t.sh/flagon-io/g1t-runner@sha256:ab");
51 assert.deepEqual(Object.keys(s.files), ["wsl-x64"]);
52 assert.equal(s.files["wsl-x64"].sha256, sha256(Buffer.from("rootfs")));
53 assert.equal(s.files["wsl-x64"].size, 6);
54 writeFileSync(join(dir, "sandbox.json"), JSON.stringify(s));
55 const m = manifest(dir, "0.3.0");
56 assert.equal(m.sandbox.runner_image, "g1t.sh/flagon-io/g1t-runner@sha256:ab");
57 assert.equal(m.sandbox.files["wsl-x64"].name, "g1t-sandbox-wsl-x64.tar.gz");
58 writeFileSync(join(dir, "sandbox.json"), JSON.stringify({ runner_image: null, files: { "vm-x64-disk": { name: "gone.raw.gz", sha256: "00" } } }));
59 assert.throws(() => manifest(dir, "0.3.0"), /gone\.raw\.gz/);
60 } finally {
61 rmSync(dir, { recursive: true, force: true });
62 }
63});
64
65test("the sandbox's files are named as the launcher asks for them", () => {
66 // crates/runner/src/selfhosted/launcher: wsl.rs's and vm.rs's image_keys().
67 assert.deepEqual(Object.keys(sandboxFiles("arm64")), ["wsl-arm64", "vm-arm64-kernel", "vm-arm64-initrd", "vm-arm64-disk"]);
68});

This file's history is long; its oldest lines are credited to the oldest commit read.