A new `swarm-builder` service, in its own container on the host that sets
`deploy.builder.enable` (defaulted on by `allSwarmServices` where the host
has the builder's store leaf, like the review classifier).
When an `agent-configs/<agent>` PR is opened, reopened or synchronized,
swarm-controller queues a `build_agent` jobq node. The node sets a
`swarm-builder` commit status to pending on the PR head, sends
`{agent, rev, pr}` to the builder over NATS request-reply
(`$SWARM.builder.build`), and writes success (store path), failure (last
line nix printed) or error (no builder / no reply) on the head. The node
fails when the build does, so the Jobs page matches the PR.
The builder builds nix/builder/check-flake's `check` with every input
overridden: hyperhive and nixpkgs to the host's own
`c0re.hyperhiveFlake`/`c0re.nixpkgsFlake` (what a hive there renders into
its meta flake), and the agent to the PR head on the forge. Evaluation is
pure and runs in the container; builds go to the host nix daemon as an
untrusted client. The private config repo is fetched with the token of a
new read-only `builder` forge account (in the `hives` team), which the
controller mints into `swarm/services/builder/forge/token`; git gets it
from a credential helper reading the child's environment, so it is in no
argument or URL.
Credentials: a `builder` store leaf minted by glue-bao-tls on the store
host, a `swarm-builder` reader policy (forge token + its own OIDC client
secret), an authelia machine client, and a `--builder-client` grant in the
queue's auth-callout responder. The controller gains a grant on the token
path and the secret publisher a deny on it.
This is the agent-config build check atlas scoped on #5081 (slice 3):
nothing is pushed to a cache, nothing is written to KV, and a red status
gates no deploy. The check composes agent-base + the config without the
values a hive adds (CA, docs, claude-code path, ports, input follows), so
it can disagree with a hive's own build.
26 lines
880 B
Nix
26 lines
880 B
Nix
# The swarm builder's build check: one agent config on hyperhive's agent base,
|
|
# composed the way a hive's meta flake composes it, minus the values a hive
|
|
# adds (its CA, docs source, claude-code path and ports).
|
|
#
|
|
# Every input is replaced at build time with `--override-input`
|
|
# (swarm-builder/src/nix_build.rs), so the URLs below are never fetched and
|
|
# the flake has no lock.
|
|
{
|
|
description = "swarm-builder: an agent config built on agent-base";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "flake:nixpkgs";
|
|
hyperhive.url = "flake:hyperhive";
|
|
hyperhive.inputs.nixpkgs.follows = "nixpkgs";
|
|
agent.url = "flake:agent";
|
|
};
|
|
|
|
outputs =
|
|
{ hyperhive, agent, ... }:
|
|
{
|
|
packages.x86_64-linux.check =
|
|
(hyperhive.nixosConfigurations.agent-base.extendModules {
|
|
modules = [ agent.nixosModules.default ];
|
|
}).config.system.build.toplevel;
|
|
};
|
|
}
|