1c0bd332

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 7s 2s 2s 10s 7s
Eval 10s 7s 7s 17s 0s
Build 14s 29s 1m12s 1m26s 42s
Suite 7s 39s 1m19s 1m26s 49s

Timeline

0s10s1m1m10s1m20s