We had an API endpoint that set up environments. It claimed a pre-warmed org from a pool, authenticated two users, imported test data, installed a bundle, and published config. Six sequential shell calls. Runtime dependency on a server. Credentials scattered across process state. A pain to debug when it failed at step 4 of 6 at 2am.
The fix wasn't to rewrite the API. It was to stop having an API at all.
The move: GitHub Actions as the runtime
The entire setup sequence now lives in a single GitHub Actions workflow file. No server, no queue, no process isolation hacks. The runner is the environment β ephemeral, observable, retryable.
The key architectural shifts:
1. Parallelise everything that can be.
The old endpoint ran sequentially because it was Node.js with a queue. GitHub Actions has native parallelism via step grouping. Auth for two users? One run block, two background processes, wait . Test data import for multiple data keys? Matrix strategy, each key in its own parallel job.β¦