summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorMalo Bourgon <mbourgon@gmail.com>2022-08-13 15:59:31 -0700
committerMalo Bourgon <mbourgon@gmail.com>2022-08-16 10:41:51 -0700
commitc3bdd6d95f605a8248768ba43338ef8269173d57 (patch)
tree3d6222ceaf294b2bb0537a1cd24b8169f4056baf /modules
parent39cf1e6fbe24c1e8fce9d9618ca964b4ef486ed2 (diff)
Update `nix.buildMachines` def and implementation to match NixOS module
Diffstat (limited to 'modules')
-rw-r--r--modules/nix/default.nix204
1 files changed, 148 insertions, 56 deletions
diff --git a/modules/nix/default.nix b/modules/nix/default.nix
index 8d05cf8..7a4bdae 100644
--- a/modules/nix/default.nix
+++ b/modules/nix/default.nix
@@ -155,48 +155,120 @@ in
};
buildMachines = mkOption {
- type = types.listOf types.attrs;
- default = [];
- example = [
- { hostName = "voila.labs.cs.uu.nl";
- sshUser = "nix";
- sshKey = "/root/.ssh/id_buildfarm";
- system = "powerpc-darwin";
- maxJobs = 1;
- }
- { hostName = "linux64.example.org";
- sshUser = "buildfarm";
- sshKey = "/root/.ssh/id_buildfarm";
- system = "x86_64-linux";
- maxJobs = 2;
- supportedFeatures = [ "kvm" ];
- mandatoryFeatures = [ "perf" ];
- }
- ];
+ type = types.listOf (types.submodule {
+ options = {
+ hostName = mkOption {
+ type = types.str;
+ example = "nixbuilder.example.org";
+ description = ''
+ The hostname of the build machine.
+ '';
+ };
+ system = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ example = "x86_64-linux";
+ description = ''
+ The system type the build machine can execute derivations on.
+ Either this attribute or <varname>systems</varname> must be
+ present, where <varname>system</varname> takes precedence if
+ both are set.
+ '';
+ };
+ systems = mkOption {
+ type = types.listOf types.str;
+ default = [ ];
+ example = [ "x86_64-linux" "aarch64-linux" ];
+ description = ''
+ The system types the build machine can execute derivations on.
+ Either this attribute or <varname>system</varname> must be
+ present, where <varname>system</varname> takes precedence if
+ both are set.
+ '';
+ };
+ sshUser = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ example = "builder";
+ description = ''
+ The username to log in as on the remote host. This user must be
+ able to log in and run nix commands non-interactively. It must
+ also be privileged to build derivations, so must be included in
+ <option>nix.settings.trusted-users</option>.
+ '';
+ };
+ sshKey = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ example = "/root/.ssh/id_buildhost_builduser";
+ description = ''
+ The path to the SSH private key with which to authenticate on
+ the build machine. The private key must not have a passphrase.
+ If null, the building user (root on NixOS machines) must have an
+ appropriate ssh configuration to log in non-interactively.
+
+ Note that for security reasons, this path must point to a file
+ in the local filesystem, *not* to the nix store.
+ '';
+ };
+ maxJobs = mkOption {
+ type = types.int;
+ default = 1;
+ description = ''
+ The number of concurrent jobs the build machine supports. The
+ build machine will enforce its own limits, but this allows hydra
+ to schedule better since there is no work-stealing between build
+ machines.
+ '';
+ };
+ speedFactor = mkOption {
+ type = types.int;
+ default = 1;
+ description = ''
+ The relative speed of this builder. This is an arbitrary integer
+ that indicates the speed of this builder, relative to other
+ builders. Higher is faster.
+ '';
+ };
+ mandatoryFeatures = mkOption {
+ type = types.listOf types.str;
+ default = [ ];
+ example = [ "big-parallel" ];
+ description = ''
+ A list of features mandatory for this builder. The builder will
+ be ignored for derivations that don't require all features in
+ this list. All mandatory features are automatically included in
+ <varname>supportedFeatures</varname>.
+ '';
+ };
+ supportedFeatures = mkOption {
+ type = types.listOf types.str;
+ default = [ ];
+ example = [ "kvm" "big-parallel" ];
+ description = ''
+ A list of features supported by this builder. The builder will
+ be ignored for derivations that require features not in this
+ list.
+ '';
+ };
+ publicHostKey = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ description = ''
+ The (base64-encoded) public host key of this builder. The field
+ is calculated via <command>base64 -w0 /etc/ssh/ssh_host_type_key.pub</command>.
+ If null, SSH will use its regular known-hosts file when connecting.
+ '';
+ };
+ };
+ });
+ default = [ ];
description = ''
- This option lists the machines to be used if distributed
- builds are enabled (see
- <option>nix.distributedBuilds</option>). Nix will perform
- derivations on those machines via SSH by copying the inputs
- to the Nix store on the remote machine, starting the build,
- then copying the output back to the local Nix store. Each
- element of the list should be an attribute set containing
- the machine's host name (<varname>hostname</varname>), the
- user name to be used for the SSH connection
- (<varname>sshUser</varname>), the Nix system type
- (<varname>system</varname>, e.g.,
- <literal>"i686-linux"</literal>), the maximum number of
- jobs to be run in parallel on that machine
- (<varname>maxJobs</varname>), the path to the SSH private
- key to be used to connect (<varname>sshKey</varname>), a
- list of supported features of the machine
- (<varname>supportedFeatures</varname>) and a list of
- mandatory features of the machine
- (<varname>mandatoryFeatures</varname>). The SSH private key
- should not have a passphrase, and the corresponding public
- key should be added to
- <filename>~<replaceable>sshUser</replaceable>/authorized_keys</filename>
- on the remote machine.
+ This option lists the machines to be used if distributed builds are
+ enabled (see <option>nix.distributedBuilds</option>).
+ Nix will perform derivations on those machines via SSH by copying the
+ inputs to the Nix store on the remote machine, starting the build,
+ then copying the output back to the local Nix store.
'';
};
@@ -540,22 +612,42 @@ in
};
# List of machines for distributed Nix builds in the format
- # expected by build-remote.
- environment.etc."nix/machines" =
- { enable = cfg.buildMachines != [];
- text =
- concatMapStrings (machine:
- "${if machine ? sshUser then "${machine.sshUser}@" else ""}${machine.hostName} "
- + machine.system or (concatStringsSep "," machine.systems)
- + " ${machine.sshKey or "-"} ${toString machine.maxJobs or 1} "
- + toString (machine.speedFactor or 1)
- + " "
- + concatStringsSep "," (machine.mandatoryFeatures or [] ++ machine.supportedFeatures or [])
- + " "
- + concatStringsSep "," machine.mandatoryFeatures or []
+ # expected by build-remote.pl.
+ environment.etc."nix/machines" = mkIf (cfg.buildMachines != [ ]) {
+ text =
+ concatMapStrings
+ (machine:
+ (concatStringsSep " " ([
+ "${optionalString (machine.sshUser != null) "${machine.sshUser}@"}${machine.hostName}"
+ (if machine.system != null then machine.system else if machine.systems != [ ] then concatStringsSep "," machine.systems else "-")
+ (if machine.sshKey != null then machine.sshKey else "-")
+ (toString machine.maxJobs)
+ (toString machine.speedFactor)
+ (concatStringsSep "," (machine.supportedFeatures ++ machine.mandatoryFeatures))
+ (concatStringsSep "," machine.mandatoryFeatures)
+ ]
+ ++ optional (isNixAtLeast "2.4pre") (if machine.publicHostKey != null then machine.publicHostKey else "-")))
+ "\n"
- ) cfg.buildMachines;
- };
+ )
+ cfg.buildMachines;
+ };
+
+ assertions =
+ let badMachine = m: m.system == null && m.systems == [ ];
+ in
+ [
+ {
+ assertion = !(any badMachine cfg.buildMachines);
+ message = ''
+ At least one system type (via <varname>system</varname> or
+ <varname>systems</varname>) must be set for every build machine.
+ Invalid machine specifications:
+ '' + " " +
+ (concatStringsSep "\n "
+ (map (m: m.hostName)
+ (filter (badMachine) cfg.buildMachines)));
+ }
+ ];
# Not in NixOS module
nix.nixPath = mkMerge [