diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/build-client.nix | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/modules/build-client.nix b/modules/build-client.nix new file mode 100644 index 00000000..763fdb38 --- /dev/null +++ b/modules/build-client.nix | |||
@@ -0,0 +1,108 @@ | |||
1 | { flake, config, lib, hostName, ... }: | ||
2 | |||
3 | with lib; | ||
4 | |||
5 | let | ||
6 | cfg = config.nix.buildServers; | ||
7 | |||
8 | secretName = name: "nix-ssh-builder-${name}-private"; | ||
9 | in { | ||
10 | options = { | ||
11 | nix = { | ||
12 | buildServers = mkOption { | ||
13 | type = types.attrsOf (types.submodule { | ||
14 | options = { | ||
15 | address = mkOption { | ||
16 | type = types.str; | ||
17 | }; | ||
18 | |||
19 | system = mkOption { | ||
20 | type = types.nullOr types.str; | ||
21 | default = null; | ||
22 | example = "x86_64-linux"; | ||
23 | description = '' | ||
24 | The system type the build machine can execute derivations on. | ||
25 | Either this attribute or <varname>systems</varname> must be | ||
26 | present, where <varname>system</varname> takes precedence if | ||
27 | both are set. | ||
28 | ''; | ||
29 | }; | ||
30 | systems = mkOption { | ||
31 | type = types.listOf types.str; | ||
32 | default = []; | ||
33 | example = [ "x86_64-linux" "aarch64-linux" ]; | ||
34 | description = '' | ||
35 | The system types the build machine can execute derivations on. | ||
36 | Either this attribute or <varname>system</varname> must be | ||
37 | present, where <varname>system</varname> takes precedence if | ||
38 | both are set. | ||
39 | ''; | ||
40 | }; | ||
41 | maxJobs = mkOption { | ||
42 | type = types.int; | ||
43 | default = 1; | ||
44 | description = '' | ||
45 | The number of concurrent jobs the build machine supports. The | ||
46 | build machine will enforce its own limits, but this allows hydra | ||
47 | to schedule better since there is no work-stealing between build | ||
48 | machines. | ||
49 | ''; | ||
50 | }; | ||
51 | speedFactor = mkOption { | ||
52 | type = types.int; | ||
53 | default = 1; | ||
54 | description = '' | ||
55 | The relative speed of this builder. This is an arbitrary integer | ||
56 | that indicates the speed of this builder, relative to other | ||
57 | builders. Higher is faster. | ||
58 | ''; | ||
59 | }; | ||
60 | mandatoryFeatures = mkOption { | ||
61 | type = types.listOf types.str; | ||
62 | default = []; | ||
63 | example = [ "big-parallel" ]; | ||
64 | description = '' | ||
65 | A list of features mandatory for this builder. The builder will | ||
66 | be ignored for derivations that don't require all features in | ||
67 | this list. All mandatory features are automatically included in | ||
68 | <varname>supportedFeatures</varname>. | ||
69 | ''; | ||
70 | }; | ||
71 | supportedFeatures = mkOption { | ||
72 | type = types.listOf types.str; | ||
73 | default = []; | ||
74 | example = [ "kvm" "big-parallel" ]; | ||
75 | description = '' | ||
76 | A list of features supported by this builder. The builder will | ||
77 | be ignored for derivations that require features not in this | ||
78 | list. | ||
79 | ''; | ||
80 | }; | ||
81 | }; | ||
82 | }); | ||
83 | default = {}; | ||
84 | }; | ||
85 | }; | ||
86 | }; | ||
87 | |||
88 | config = mkIf (cfg != {}) { | ||
89 | programs.ssh.extraConfig = concatMapStringsSep "\n" ({ name, value }: '' | ||
90 | Host ${name} | ||
91 | User nix-ssh-builder | ||
92 | HostName ${value.address} | ||
93 | IdentitiesOnly yes | ||
94 | IdentityFile ${config.sops.secrets.${secretName name}.path} | ||
95 | ControlMaster auto | ||
96 | ControlPath /run/nix-ssh-builder-master-%r@%n:%p | ||
97 | ControlPersist 30m | ||
98 | Compression yes | ||
99 | ForwardAgent no | ||
100 | ServerAliveInterval 6 | ||
101 | ServerAliveCountMax 10 | ||
102 | '') (mapAttrsToList nameValuePair cfg); | ||
103 | |||
104 | sops.secrets = mapAttrs' (name: hCfg: nameValuePair (secretName name) { sopsFile = ../system-profiles/build-server/clients + "/${hostName}/private"; format = "binary"; }) cfg; | ||
105 | |||
106 | nix.buildMachines = mapAttrsToList (hostName: hCfg: { inherit hostName; inherit (hCfg) system systems maxJobs speedFactor mandatoryFeatures supportedFeatures; }) cfg; | ||
107 | }; | ||
108 | } | ||