Skip to content

test: demonstrate the regtest stack on a second GH runner - #205

Draft
mdozhdev wants to merge 2 commits into
synonymdev:mainfrom
mdozhdev:test/two-runner-regtest
Draft

test: demonstrate the regtest stack on a second GH runner#205
mdozhdev wants to merge 2 commits into
synonymdev:mainfrom
mdozhdev:test/two-runner-regtest

Conversation

@mdozhdev

Copy link
Copy Markdown

What this is

Evidence for a decision, not a second implementation. #204 runs the regtest stack on an ephemeral GCP VM; this shows the same thing working on a second GitHub-hosted runner, reached over Tailscale — which needs no cloud account at all.

Draft deliberately: if the team picks the VM route this should be closed, not merged.

Why it matters

The VM approach needs a GCP project and IAM access to configure Workload Identity Federation. That is an organisational dependency, not an engineering one, and it is currently the thing blocking #204 from running anywhere.

This route needs a tailnet and one repository secret.

Three things had to hold, and all three do

Verified on a real run:

100.124.126.109 - - [17:37:19] "GET /shell.txt HTTP/1.1" 200 -        ← the Mac's shell
100.124.126.109 - - [17:40:27] "GET /simulator.txt HTTP/1.1" 200 -    ← inside the Simulator
100.124.126.109 - - [17:40:32] "GET /favicon.ico HTTP/1.1" 404 -      ← Safari
  1. Two hosted runners can reach each other. Both sit behind NAT with no inbound connectivity, so this goes over Tailscale — plain WireGuard cannot traverse it. Peer addresses come from tailscale status, not MagicDNS, because the action configures macOS DNS against a network service named Ethernet that these runners do not have.
  2. The stack job can outlive its own steps, by blocking on the tester's job status. Neither job may declare needs: on the other or they deadlock — this is what broke the Oct 2025 test/e2e-workflow attempt, which used needs: and lost its containers before any test ran.
  3. An iOS Simulator can reach the tailnet. Asserted by the stack runner against its own access log, on a path the tester's shell never fetches, so nothing on the Mac can satisfy it locally.

How the two compare

VM (#204) Two runners (this)
Proven end to end
Cloud account GCP + WIF none
External dependency GCP Tailscale
Cost ~$0.05/run free on public repos
Concurrency 1 job/shard 2 jobs/shard, both billing throughout
Debugging SSH into a live VM machines vanish

Everything test-side is shared between them — the compose change, constants.ts, lnd.ts and wdio.conf.ts in #204 are identical either way. Only provisioning differs, so this is not a fork in the road that costs anything to defer.

Setup, if you want to run it

  • A tailnet, free tier is sufficient
  • secrets.TS_AUTHKEY — reusable, ephemeral, tagged tag:ci
  • An ACL allowing tag:ci to reach tag:ci

workflow_dispatch only. Merging it changes nothing on its own.

Related

mdozhdev and others added 2 commits August 21, 2026 18:47
Alternative to provisioning a cloud VM, motivated by that approach needing
a GCP project and IAM access which is not always obtainable.

Three things had to hold and all three do:

  - Two GitHub-hosted runners can reach each other. Both are behind NAT
    with no inbound connectivity, so this goes over Tailscale; plain
    WireGuard cannot traverse it. Peer addresses come from `tailscale
    status` rather than MagicDNS, which the action cannot configure on
    these runners.
  - The stack job can outlive its own steps, by blocking on the tester's
    job status. Neither job may declare needs: on the other or they
    deadlock.
  - An iOS Simulator can reach the tailnet, not just the Mac's shell.

The last is asserted by the stack runner against its own access log, on a
path the tester's shell does not fetch, so nothing on the Mac can satisfy
it locally.

Dispatch only, and independent of the VM tooling — this is evidence for
choosing between the two, not a second implementation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant