2023-06-07 02:50:00 +00:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
let
|
|
|
|
inherit (pkgs) stdenv;
|
|
|
|
|
|
|
|
cfg = config.nix.linux-builder;
|
|
|
|
|
|
|
|
builderWithOverrides = cfg.package.override {
|
2023-09-28 00:49:38 +00:00
|
|
|
modules = [ cfg.config ];
|
2023-06-07 02:50:00 +00:00
|
|
|
};
|
2023-10-09 23:08:01 +00:00
|
|
|
|
|
|
|
# create-builder uses TMPDIR to share files with the builder, notably certs.
|
|
|
|
# macOS will clean up files in /tmp automatically that haven't been accessed in 3+ days.
|
|
|
|
# If we let it use /tmp, leaving the computer asleep for 3 days makes the certs vanish.
|
|
|
|
# So we'll use /run/org.nixos.linux-builder instead and clean it up ourselves.
|
|
|
|
script = pkgs.writeShellScript "linux-builder-start" ''
|
|
|
|
export TMPDIR=/run/org.nixos.linux-builder USE_TMPDIR=1
|
|
|
|
rm -rf $TMPDIR
|
|
|
|
mkdir -p $TMPDIR
|
|
|
|
trap "rm -rf $TMPDIR" EXIT
|
2024-01-14 18:01:24 +00:00
|
|
|
${lib.optionalString cfg.ephemeral ''
|
|
|
|
rm -f ${cfg.workingDirectory}/${builderWithOverrides.nixosConfig.networking.hostName}.qcow2
|
|
|
|
''}
|
2023-10-09 23:08:01 +00:00
|
|
|
${builderWithOverrides}/bin/create-builder
|
|
|
|
'';
|
2023-06-07 02:50:00 +00:00
|
|
|
in
|
|
|
|
|
|
|
|
{
|
2023-09-28 00:49:38 +00:00
|
|
|
imports = [
|
|
|
|
(mkRemovedOptionModule [ "nix" "linux-builder" "modules" ] "This option has been replaced with `nix.linux-builder.config` which allows setting options directly like `nix.linux-builder.config.networking.hostName = \"banana\";.")
|
|
|
|
];
|
|
|
|
|
2023-06-07 02:50:00 +00:00
|
|
|
options.nix.linux-builder = {
|
|
|
|
enable = mkEnableOption (lib.mdDoc "Linux builder");
|
|
|
|
|
|
|
|
package = mkOption {
|
|
|
|
type = types.package;
|
|
|
|
default = pkgs.darwin.linux-builder;
|
|
|
|
defaultText = "pkgs.darwin.linux-builder";
|
|
|
|
description = lib.mdDoc ''
|
|
|
|
This option specifies the Linux builder to use.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2023-09-28 00:49:38 +00:00
|
|
|
config = mkOption {
|
|
|
|
type = types.deferredModule;
|
|
|
|
default = { };
|
2023-06-07 02:50:00 +00:00
|
|
|
example = literalExpression ''
|
2023-09-28 00:49:38 +00:00
|
|
|
({ pkgs, ... }:
|
2023-06-07 02:50:00 +00:00
|
|
|
|
2023-09-28 00:49:38 +00:00
|
|
|
{
|
|
|
|
environment.systemPackages = [ pkgs.neovim ];
|
|
|
|
})
|
2023-06-07 02:50:00 +00:00
|
|
|
'';
|
|
|
|
description = lib.mdDoc ''
|
2023-09-28 00:49:38 +00:00
|
|
|
This option specifies extra NixOS configuration for the builder. You should first use the Linux builder
|
|
|
|
without changing the builder configuration otherwise you may not be able to build the Linux builder.
|
2023-06-07 02:50:00 +00:00
|
|
|
'';
|
|
|
|
};
|
2023-08-02 19:33:34 +00:00
|
|
|
|
2024-02-21 17:27:02 +00:00
|
|
|
mandatoryFeatures = mkOption {
|
|
|
|
type = types.listOf types.str;
|
|
|
|
default = [];
|
2024-02-21 18:34:16 +00:00
|
|
|
defaultText = literalExpression ''[]'';
|
|
|
|
example = literalExpression ''[ "big-parallel" ]'';
|
2024-02-21 17:27:02 +00:00
|
|
|
description = lib.mdDoc ''
|
|
|
|
A list of features mandatory for the Linux builder. The builder will
|
|
|
|
be ignored for derivations that don't require all features in
|
|
|
|
this list. All mandatory features are automatically included in
|
|
|
|
{var}`supportedFeatures`.
|
|
|
|
|
|
|
|
This sets the corresponding `nix.buildMachines.*.mandatoryFeatures` option.
|
2024-02-21 18:34:16 +00:00
|
|
|
'';
|
|
|
|
};
|
2024-02-21 17:27:02 +00:00
|
|
|
|
2023-08-02 19:33:34 +00:00
|
|
|
maxJobs = mkOption {
|
|
|
|
type = types.ints.positive;
|
|
|
|
default = 1;
|
|
|
|
example = 4;
|
|
|
|
description = lib.mdDoc ''
|
2024-02-18 12:25:01 +00:00
|
|
|
The number of concurrent jobs the Linux builder 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.
|
2023-08-02 19:33:34 +00:00
|
|
|
|
|
|
|
This sets the corresponding `nix.buildMachines.*.maxJobs` option.
|
|
|
|
'';
|
|
|
|
};
|
2023-10-18 15:47:27 +00:00
|
|
|
|
2024-02-20 21:10:24 +00:00
|
|
|
protocol = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "ssh-ng";
|
2024-02-21 18:34:16 +00:00
|
|
|
defaultText = literalExpression ''"ssh-ng"'';
|
|
|
|
example = literalExpression ''"ssh"'';
|
2024-02-20 21:10:24 +00:00
|
|
|
description = lib.mdDoc ''
|
|
|
|
The protocol used for communicating with the build machine. Use
|
|
|
|
`ssh-ng` if your remote builder and your local Nix version support that
|
|
|
|
improved protocol.
|
|
|
|
|
|
|
|
Use `null` when trying to change the special localhost builder without a
|
|
|
|
protocol which is for example used by hydra.
|
2024-02-21 17:29:40 +00:00
|
|
|
'';
|
|
|
|
};
|
2024-02-21 17:27:02 +00:00
|
|
|
|
2024-02-18 12:25:01 +00:00
|
|
|
speedFactor = mkOption {
|
|
|
|
type = types.ints.positive;
|
|
|
|
default = 1;
|
2024-02-21 18:34:16 +00:00
|
|
|
defaultText = literalExpression ''1'';
|
2024-02-18 12:25:01 +00:00
|
|
|
description = lib.mdDoc ''
|
|
|
|
The relative speed of the Linux builder. This is an arbitrary integer
|
|
|
|
that indicates the speed of this builder, relative to other
|
|
|
|
builders. Higher is faster.
|
|
|
|
|
|
|
|
This sets the corresponding `nix.buildMachines.*.speedFactor` option.
|
2024-02-20 21:10:24 +00:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2023-10-18 15:47:27 +00:00
|
|
|
supportedFeatures = mkOption {
|
|
|
|
type = types.listOf types.str;
|
|
|
|
default = [ "kvm" "benchmark" "big-parallel" ];
|
2024-02-21 18:34:16 +00:00
|
|
|
defaultText = literalExpression ''[ "kvm" "benchmark" "big-parallel" ]'';
|
|
|
|
example = literalExpression ''[ "kvm" "big-parallel" ]'';
|
2023-10-18 15:47:27 +00:00
|
|
|
description = lib.mdDoc ''
|
2024-02-18 12:25:01 +00:00
|
|
|
A list of features supported by the Linux builder. The builder will
|
|
|
|
be ignored for derivations that require features not in this
|
|
|
|
list.
|
2023-10-18 15:47:27 +00:00
|
|
|
|
|
|
|
This sets the corresponding `nix.buildMachines.*.supportedFeatures` option.
|
|
|
|
'';
|
|
|
|
};
|
2024-01-14 18:01:24 +00:00
|
|
|
|
2024-02-21 17:29:40 +00:00
|
|
|
systems = mkOption {
|
|
|
|
type = types.listOf types.str;
|
|
|
|
default = [ "${stdenv.hostPlatform.uname.processor}-linux" ];
|
2024-02-21 18:34:16 +00:00
|
|
|
defaultText = literalExpression ''[ "''${stdenv.hostPlatform.uname.processor}-linux" ]'';
|
2024-02-21 17:29:40 +00:00
|
|
|
example = literalExpression ''
|
|
|
|
[
|
|
|
|
"x86_64-linux"
|
|
|
|
"aarch64-linux"
|
|
|
|
]
|
|
|
|
'';
|
|
|
|
description = lib.mdDoc ''
|
|
|
|
This option specifies system types the build machine can execute derivations on.
|
|
|
|
|
|
|
|
This sets the corresponding `nix.buildMachines.*.systems` option.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2024-01-14 18:01:24 +00:00
|
|
|
workingDirectory = mkOption {
|
|
|
|
type = types.str;
|
|
|
|
default = "/var/lib/darwin-builder";
|
|
|
|
description = lib.mdDoc ''
|
|
|
|
The working directory of the Linux builder daemon process.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
ephemeral = mkEnableOption (lib.mdDoc ''
|
|
|
|
wipe the builder's filesystem on every restart.
|
|
|
|
|
|
|
|
This is disabled by default as maintaining the builder's Nix Store reduces
|
|
|
|
rebuilds. You can enable this if you don't want your builder to accumulate
|
|
|
|
state.
|
|
|
|
'');
|
2023-06-07 02:50:00 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
assertions = [ {
|
2023-07-09 03:07:03 +00:00
|
|
|
assertion = config.nix.settings.trusted-users != [ "root" ] || (config.nix.settings.extra-trusted-users or [ ]) != [ ];
|
2023-06-07 02:50:00 +00:00
|
|
|
message = ''
|
|
|
|
Your user or group (@admin) needs to be added to `nix.settings.trusted-users` or `nix.settings.extra-trusted-users`
|
|
|
|
to use the Linux builder.
|
|
|
|
'';
|
|
|
|
} ];
|
|
|
|
|
|
|
|
system.activationScripts.preActivation.text = ''
|
2024-01-14 18:01:24 +00:00
|
|
|
mkdir -p ${cfg.workingDirectory}
|
2023-06-07 02:50:00 +00:00
|
|
|
'';
|
|
|
|
|
|
|
|
launchd.daemons.linux-builder = {
|
|
|
|
environment = {
|
|
|
|
inherit (config.environment.variables) NIX_SSL_CERT_FILE;
|
|
|
|
};
|
|
|
|
serviceConfig = {
|
|
|
|
ProgramArguments = [
|
|
|
|
"/bin/sh" "-c"
|
2023-10-09 23:08:01 +00:00
|
|
|
"/bin/wait4path /nix/store && exec ${script}"
|
2023-06-07 02:50:00 +00:00
|
|
|
];
|
|
|
|
KeepAlive = true;
|
|
|
|
RunAtLoad = true;
|
2024-01-14 18:01:24 +00:00
|
|
|
WorkingDirectory = cfg.workingDirectory;
|
2023-06-07 02:50:00 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
environment.etc."ssh/ssh_config.d/100-linux-builder.conf".text = ''
|
|
|
|
Host linux-builder
|
|
|
|
Hostname localhost
|
|
|
|
HostKeyAlias linux-builder
|
|
|
|
Port 31022
|
|
|
|
'';
|
|
|
|
|
|
|
|
nix.distributedBuilds = true;
|
|
|
|
|
|
|
|
nix.buildMachines = [{
|
|
|
|
hostName = "linux-builder";
|
|
|
|
sshUser = "builder";
|
|
|
|
sshKey = "/etc/nix/builder_ed25519";
|
|
|
|
publicHostKey = "c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUpCV2N4Yi9CbGFxdDFhdU90RStGOFFVV3JVb3RpQzVxQkorVXVFV2RWQ2Igcm9vdEBuaXhvcwo=";
|
2024-02-21 17:29:40 +00:00
|
|
|
inherit (cfg) mandatoryFeatures maxJobs protocol speedFactor supportedFeatures systems;
|
2023-06-07 02:50:00 +00:00
|
|
|
}];
|
|
|
|
|
|
|
|
nix.settings.builders-use-substitutes = true;
|
|
|
|
};
|
|
|
|
}
|