2025-03-28 17:26:50 -04:00
{
config ,
lib ,
2026-01-11 16:38:56 -05:00
pkgs ,
2025-03-28 17:26:50 -04:00
. . .
} :
2026-01-11 16:38:56 -05:00
let
2026-02-21 14:43:38 -05:00
# patchScriptBin =
# {
# filename,
# contents,
# path ? [ ],
# }:
# ((pkgs.writeScriptBin filename contents).overrideAttrs (old: {
# buildInputs = [ pkgs.makeWrapper ];
# buildCommand = "${old.buildCommand}\n patchShebangs $out\nwrapProgram $out/bin/${filename} --prefix PATH : ${lib.makeBinPath path}";
# }));
nix_builder = pkgs . rustPlatform . buildRustPackage rec {
pname = " n i x _ b u i l d e r " ;
version = " 0 . 0 . 0 " ;
src = pkgs . fetchgit {
url = " h t t p s : / / c o d e . f i z z . b u z z / t a l e x a n d e r / n i x _ b u i l d e r . g i t " ;
# tag = version;
rev = " d 0 f c 2 3 3 1 e 7 a a d c 8 b d d 9 8 8 3 6 b 4 6 6 1 7 2 a c 3 7 6 2 8 e 7 d " ;
hash = " s h a 2 5 6 - V 1 D U 9 U 4 + k 9 6 K f G V 9 B T x K Y j x L z V 6 t W v Q P M + a + 5 N U 9 4 G 8 = " ;
leaveDotGit = false ;
} ;
cargoLock = {
lockFile = " ${ src } / C a r g o . l o c k " ;
} ;
meta = with lib ; {
description = " A b u i l d e r o f n i x c o n f i g s f o r a b u i l d s e r v e r . " ;
homepage = " h t t p s : / / c o d e . f i z z . b u z z / t a l e x a n d e r / n i x _ b u i l d e r " ;
license = licenses . bsd0 ;
maintainers = [ ] ;
} ;
nativeBuildInputs = [ pkgs . makeWrapper ] ;
postInstall = ''
wrapProgram $ out/bin/nix-builder - - prefix PATH : $ {
lib . makeBinPath [
pkgs . git
pkgs . nix
pkgs . nixos-rebuild
]
}
'' ;
} ;
2026-01-11 16:38:56 -05:00
in
2025-03-28 17:26:50 -04:00
{
imports = [ ] ;
options . me = {
hydra . enable = lib . mkOption {
type = lib . types . bool ;
default = false ;
example = true ;
description = " W h e t h e r w e w a n t t o i n s t a l l h y d r a . " ;
} ;
} ;
2025-10-11 00:08:02 -04:00
config = lib . mkIf config . me . hydra . enable {
2026-01-11 16:38:56 -05:00
environment . systemPackages = with pkgs ; [
2026-02-21 14:43:38 -05:00
nix_builder
sqlite # For manually inspecting the database.
2026-01-11 16:38:56 -05:00
] ;
environment . persistence . " / p e r s i s t " = lib . mkIf ( config . me . mountPersistence ) {
hideMounts = true ;
users . nixworker = {
directories = [
{
directory = " p e r s i s t " ;
user = " n i x w o r k e r " ;
group = " n i x w o r k e r " ;
mode = " 0 7 0 0 " ;
}
] ;
} ;
} ;
# 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 . " / h o m e / n i x w o r k e r / p e r s i s t / r o o t / n i x / v a r / n i x / b u i l d s " = {
device = " t m p f s " ;
fsType = " t m p f s " ;
options = [
" s i z e = 4 0 G " # adjust for your situation and needs
" m o d e = 7 0 0 "
" u i d = 1 1 4 0 0 "
" g i d = 1 1 4 0 0 "
] ;
2025-10-11 00:08:02 -04:00
} ;
2025-03-28 17:26:50 -04:00
2026-01-11 16:38:56 -05:00
systemd . timers . " b u i l d - c a c h e " = {
wantedBy = [ " t i m e r s . t a r g e t " ] ;
timerConfig = {
2026-02-21 14:43:38 -05:00
OnCalendar = " * - * - * 0 3 : 0 0 : 0 0 A m e r i c a / N e w _ Y o r k " ;
2026-01-11 16:38:56 -05:00
Unit = " b u i l d - c a c h e . s e r v i c e " ;
} ;
} ;
systemd . services . " b u i l d - c a c h e " = {
script = ''
set - euo pipefail
IFS = $ ' \ n \ t'
DIR = " $ ( c d " $ ( dirname " ' ' ${ BASH_SOURCE [ 0 ] } " ) " & & p w d ) "
2026-02-21 14:43:38 -05:00
NIX_REMOTE = ' local ? root = /home/nixworker/persist/root ' RUST_BACKTRACE = 1 RUST_LOG = nix_builder = DEBUG $ { nix_builder } /bin/nix-builder build - - config $ { ./files/nix_builder.toml } - - target odo - - target odo_update - - target odowork - - target odowork_update - - target quark - - target quark_update - - target hydra - - target hydra_update - - target controller0 - - target controller0_update - - target controller1 - - target controller1_update - - target controller2 - - target controller2_update - - target worker0 - - target worker0_update - - target worker1 - - target worker1_update - - target worker2 - - target worker2_update
'' ;
restartIfChanged = false ;
serviceConfig = {
Type = " s i m p l e " ;
User = " n i x w o r k e r " ;
# 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 . " c l e a n - c a c h e " = {
wantedBy = [ " t i m e r s . t a r g e t " ] ;
timerConfig = {
OnCalendar = " * - * - 0 1 0 2 : 0 0 : 0 0 A m e r i c a / N e w _ Y o r k " ;
Unit = " c l e a n - c a c h e . s e r v i c e " ;
} ;
} ;
systemd . services . " c l e a n - c a c h e " = {
script = ''
set - euo pipefail
IFS = $ ' \ n \ t'
DIR = " $ ( c d " $ ( dirname " ' ' ${ BASH_SOURCE [ 0 ] } " ) " & & p w d ) "
NIX_REMOTE = ' local ? root = /home/nixworker/persist/root ' nix-collect-garbage - d
2026-01-11 16:38:56 -05:00
'' ;
2026-02-21 14:43:38 -05:00
path = with pkgs ; [
pkgs . nix
] ;
2026-01-11 16:38:56 -05:00
restartIfChanged = false ;
serviceConfig = {
Type = " s i m p l e " ;
User = " n i x w o r k e r " ;
2026-02-21 14:43:38 -05:00
# 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
2026-01-11 16:38:56 -05:00
LimitNOFILE = 8192 ;
} ;
} ;
2025-10-11 00:08:02 -04:00
} ;
2025-03-28 17:26:50 -04:00
}