From 905c6aa06c00150f0c051ead776a64aee0b2212c Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Sat, 15 Nov 2025 09:36:40 -0500 Subject: Refactor NixOS integration to use pre-declared targets Problem: Calling bild.run inside NixOS configs triggers recursive builds during OS image creation, causing slow IFD evaluations that worsen as complexity grows. Solution: Create Biz/Targets.nix that pre-declares all buildable targets as an attribute set. NixOS configs now import and reference these targets directly, eliminating recursive builds during evaluation. Changes: - Add Biz/Targets.nix exposing storybook, podcastitlater-web, podcastitlater-worker, dragons-analysis - Update Biz.nix to import targets and reference them - Update Biz/Dragons/Analysis.nix to use targets pattern Benefits: - All bild.run calls happen once at top level during targets evaluation - NixOS service configs reference pre-built derivations - Scalable: adding targets doesn't slow individual builds - Explicit: clear what gets built for each OS Amp-Thread-ID: https://ampcode.com/threads/T-bc0f6fc7-46bf-4aa2-892e-dd62e7251d4b Co-authored-by: Amp --- Biz.nix | 68 ++++++++++++++++++++++++++++++++++------------------------------- 1 file changed, 36 insertions(+), 32 deletions(-) (limited to 'Biz.nix') diff --git a/Biz.nix b/Biz.nix index a76fd8c..7435c08 100755 --- a/Biz.nix +++ b/Biz.nix @@ -1,34 +1,38 @@ #!/usr/bin/env run.sh # nunya -{bild, ...}: -# This is the biz hosting service. Currently it defines a base OS similar to -# Omni/Cloud.nix et al and starts each Biz/* thing as a systemd service. A -# better solution might be to define each Biz/* thing as a container, and then -# wire them together as necessary here, but I don't know how that works so I'll -# just stick to this method for now. -bild.os { - imports = [ - ./Omni/Cloud/Hardware.nix - ./Omni/Os/Base.nix - ./Omni/Packages.nix - ./Omni/Users.nix - ./Biz/Storybook.nix - ./Biz/PodcastItLater/Web.nix - ./Biz/PodcastItLater/Worker.nix - ]; - networking.hostName = "biz"; - networking.domain = "storybook.bensima.com"; - time.timeZone = "America/New_York"; - services.storybook = { - enable = false; - package = bild.run ./Biz/Storybook.py; - }; - services.podcastitlater-web = { - enable = true; - package = bild.run ./Biz/PodcastItLater/Web.py; - }; - services.podcastitlater-worker = { - enable = true; - package = bild.run ./Biz/PodcastItLater/Worker.py; - }; -} +{bild, ...}: let + # Pre-declared targets prevent recursive builds during NixOS evaluation. + # All bild.run calls happen once at this top level. + targets = import ./Biz/Targets.nix {inherit bild;}; +in + # This is the biz hosting service. Currently it defines a base OS similar to + # Omni/Cloud.nix et al and starts each Biz/* thing as a systemd service. A + # better solution might be to define each Biz/* thing as a container, and then + # wire them together as necessary here, but I don't know how that works so I'll + # just stick to this method for now. + bild.os { + imports = [ + ./Omni/Cloud/Hardware.nix + ./Omni/Os/Base.nix + ./Omni/Packages.nix + ./Omni/Users.nix + ./Biz/Storybook.nix + ./Biz/PodcastItLater/Web.nix + ./Biz/PodcastItLater/Worker.nix + ]; + networking.hostName = "biz"; + networking.domain = "storybook.bensima.com"; + time.timeZone = "America/New_York"; + services.storybook = { + enable = false; + package = targets.storybook; + }; + services.podcastitlater-web = { + enable = true; + package = targets.podcastitlater-web; + }; + services.podcastitlater-worker = { + enable = true; + package = targets.podcastitlater-worker; + }; + } -- cgit v1.2.3