4236deca

By: Tom Sydney Kerckhove <syd@cs-syd.eu>

nix-ci-eval: a fast, parallel flake-output discoverer

A small tool that discovers a flake's buildable outputs for one system,
purpose-built for NixCI's show jobs. It links only the LGPL-2.1 Nix
evaluator libraries.

Given a flake reference and a system it streams one newline-delimited
JSON object per discovered output, tagged by type (job / error /
dependency), then the dependency edges between the outputs. Each
attribute path carries its system component so it names the attribute
exactly as `nix build` takes it, and a failing attribute becomes an
error line rather than aborting the run.

A coordinator forks worker processes, each with its own Nix evaluator.
--workers is a ceiling, not a count: the pool grows on demand, sized from
what the run measures an evaluation and a worker to cost, so a small
flake never forks a pool it cannot keep busy and a large one still ramps
to the ceiling.

Tested by pure unit tests for the Nix-free helpers and a hermetic
integration test that drives the built binary against a fixture flake
with no inputs and diffs a golden.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 24s 1s 1s 25s 24s
Eval 31s 5s 5s 36s 5s
Build 34s 0s 0s 34s 0s
Suite 24s 7s 12s 36s 29s

Timeline

0s