{ config, lib, pkgs, nix_builder, ... }: { imports = [ ]; options.me = { hydra.enable = lib.mkOption { type = lib.types.bool; default = false; example = true; description = "Whether we want to install hydra."; }; }; config = lib.mkIf config.me.hydra.enable { environment.systemPackages = with pkgs; [ nix_builder.packages.x86_64-linux.default sqlite # For manually inspecting the database. ]; environment.persistence."/persist" = lib.mkIf (config.me.mountPersistence) { hideMounts = true; users.nixworker = { directories = [ { directory = "persist"; user = "nixworker"; group = "nixworker"; mode = "0700"; } ]; }; }; # Nix 2.30.0 (2025-07-07) changed the build directory from /tmp to /nix/var/nix/builds which broke a number of builds because my ZFS datasets were utf8only. fileSystems."/.disk/root/nix/var/nix/builds" = { device = "tmpfs"; fsType = "tmpfs"; options = [ "size=50G" # adjust for your situation and needs "mode=700" "uid=11400" "gid=11400" ]; }; systemd.timers."build-cache" = { wantedBy = [ "timers.target" ]; timerConfig = { OnCalendar = "*-*-* 03:00:00 America/New_York"; Unit = "build-cache.service"; }; }; systemd.services."build-cache" = let enabled_targets = [ "odo" "odo_update" "odowork" "odowork_update" "quark" "quark_update" "hydra" "hydra_update" "controller0" "controller0_update" "controller1" "controller1_update" "controller2" "controller2_update" "worker0" "worker0_update" "worker1" "worker1_update" "worker2" "worker2_update" "family_disks" "family_disks_update" # "nixbsd" # Disabled due to onetbb tests hanging on one-cpu machines. ]; build_flags = lib.concatMap (target: [ "--target" (lib.escapeShellArg target) ]) enabled_targets; in { script = '' set -euo pipefail IFS=$'\n\t' DIR="$( cd "$( dirname "''${BASH_SOURCE[0]}" )" && pwd )" NIX_REMOTE='local?root=/.disk/root' RUST_BACKTRACE=1 RUST_LOG=nix_builder=DEBUG ${nix_builder.packages.x86_64-linux.default}/bin/nix-builder build --config ${./files/nix_builder.toml} ${builtins.concatStringsSep " " build_flags} ''; restartIfChanged = false; serviceConfig = { Type = "simple"; User = "nixworker"; # restartIfChanged = false; # RemainAfterExit = true; # Prevents the service from automatically starting on rebuild. See https://discourse.nixos.org/t/how-to-prevent-custom-systemd-service-from-restarting-on-nixos-rebuild-switch/43431 LimitNOFILE = 8192; }; }; # TODO: This should move into nix-builder so we can only run clean when builds are passing. Otherwise partial builds will lose progress. # TODO: In nix-builder maybe include setting to auto delete to make room during builds if we run out of space, just in case builds are failing for a long time and prevent cleanup from running. # systemd.timers."clean-cache" = { # wantedBy = [ "timers.target" ]; # timerConfig = { # OnCalendar = "*-*-01 02:00:00 America/New_York"; # Unit = "clean-cache.service"; # }; # }; systemd.services."clean-cache" = { script = '' set -euo pipefail IFS=$'\n\t' DIR="$( cd "$( dirname "''${BASH_SOURCE[0]}" )" && pwd )" NIX_REMOTE='local?root=/.disk/root' nix-collect-garbage -d ''; path = with pkgs; [ pkgs.nix ]; restartIfChanged = false; serviceConfig = { Type = "simple"; User = "nixworker"; # restartIfChanged = false; # RemainAfterExit = true; # Prevents the service from automatically starting on rebuild. See https://discourse.nixos.org/t/how-to-prevent-custom-systemd-service-from-restarting-on-nixos-rebuild-switch/43431 LimitNOFILE = 8192; }; }; }; }