b4d62c89

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 6m08s 2s 2s 6m10s 6m08s
Eval 6m10s 17s 17s 6m27s 0s
Build 48m23s 37s 37s 49m00s 41m56s
Suite 6m08s 56s 42m52s 49m00s 48m04s

Timeline

0s6m10s6m20s48m30s48m40s48m50s49m