git.delta.rocks / jrsonnet / refs/commits / 4e7930a0a457

difftreelog

feat build specializations

Yaroslav Bolyukin2022-12-09parent: #38d1791.patch.diff
in: trunk

2 files changed

modifiedcmds/fleet/src/cmds/build_systems.rsdiffbeforeafterboth
--- a/cmds/fleet/src/cmds/build_systems.rs
+++ b/cmds/fleet/src/cmds/build_systems.rs
@@ -49,21 +49,45 @@
 
 enum PackageAction {
 	SdImage,
+	InstallationCd,
+}
+impl PackageAction {
+	fn build_attr(&self) -> String {
+		match self {
+			PackageAction::SdImage => "sdImage".to_owned(),
+			PackageAction::InstallationCd => "installationCd".to_owned(),
+		}
+	}
 }
 
 enum Action {
-	Upload(Option<UploadAction>),
+	Upload { action: Option<UploadAction> },
 	Package(PackageAction),
 }
+impl Action {
+	fn build_attr(&self) -> String {
+		match self {
+			Action::Upload { .. } => "toplevel".to_owned(),
+			Action::Package(p) => p.build_attr(),
+		}
+	}
+}
 
 impl From<Subcommand> for Action {
 	fn from(s: Subcommand) -> Self {
 		match s {
-			Subcommand::Upload => Self::Upload(None),
-			Subcommand::Test => Self::Upload(Some(UploadAction::Test)),
-			Subcommand::Boot => Self::Upload(Some(UploadAction::Boot)),
-			Subcommand::Switch => Self::Upload(Some(UploadAction::Switch)),
+			Subcommand::Upload => Self::Upload { action: None },
+			Subcommand::Test => Self::Upload {
+				action: Some(UploadAction::Test),
+			},
+			Subcommand::Boot => Self::Upload {
+				action: Some(UploadAction::Boot),
+			},
+			Subcommand::Switch => Self::Upload {
+				action: Some(UploadAction::Switch),
+			},
 			Subcommand::SdImage => Self::Package(PackageAction::SdImage),
+			Subcommand::InstallationCd => Self::Package(PackageAction::InstallationCd),
 		}
 	}
 }
@@ -79,13 +103,16 @@
 	/// Upload + test + boot
 	Switch,
 
-	/// Build sd image
+	/// Build SD .img image
 	SdImage,
+	/// Build an installation cd ISO image
+	InstallationCd,
 }
 
 impl BuildSystems {
 	async fn build_task(self, config: Config, host: String) -> Result<()> {
 		info!("building");
+		let action = Action::from(self.subcommand.clone());
 		let built = {
 			let dir = tempfile::tempdir()?;
 			dir.path().to_owned()
@@ -108,10 +135,12 @@
 				"--out-link",
 			])
 			.arg(&built)
-			.arg(config.configuration_attr_name(&format!(
-				"configuredSystems.{}.config.system.build.toplevel",
-				host
-			)));
+			.arg(
+				config.configuration_attr_name(&format!(
+					"buildSystems.{}.{host}",
+					action.build_attr()
+				)),
+			);
 
 		if self.show_trace {
 			nix_build.arg("--show-trace");
@@ -129,11 +158,9 @@
 
 		nix_build.run_nix().await?;
 		let built = std::fs::canonicalize(built)?;
-
-		let action = Action::from(self.subcommand.clone());
 
 		match action {
-			Action::Upload(action) => {
+			Action::Upload { action } => {
 				if !config.is_local(&host) {
 					info!("uploading system closure");
 					let mut tries = 0;
@@ -194,10 +221,43 @@
 				nix_build
 					.args(&["build", "--impure", "--no-link", "--out-link"])
 					.arg(&out)
-					.arg(config.configuration_attr_name(&format!(
-						"configuredSystems.{}.config.system.build.sdImage",
-						host,
-					)));
+					.arg(
+						config.configuration_attr_name(&format!("buildSystems.sdImage.{}", host,)),
+					);
+				if let Some(builders) = &self.builders {
+					nix_build.arg("--builders").arg(builders);
+				}
+				if let Some(jobs) = &self.jobs {
+					nix_build.arg("--max-jobs");
+					nix_build.arg(format!("{}", jobs));
+				}
+				if !self.fail_fast {
+					nix_build.arg("--keep-going");
+				}
+
+				nix_build.inherit_stdio().run_nix().await?;
+			}
+			Action::Package(PackageAction::InstallationCd) => {
+				let mut out = current_dir()?;
+				out.push(format!("installation-cd-{}", host));
+
+				info!("building sd image to {:?}", out);
+				let mut nix_build = if self.privileged_build {
+					let mut out = Command::new("sudo");
+					out.arg("nix");
+					out
+				} else {
+					Command::new("nix")
+				};
+				nix_build
+					.args(&["build", "--impure", "--no-link", "--out-link"])
+					.arg(&out)
+					.arg(
+						config.configuration_attr_name(&format!(
+							"buildSystems.installationCd.{}",
+							host,
+						)),
+					);
 				if let Some(builders) = &self.builders {
 					nix_build.arg("--builders").arg(builders);
 				}
modifiedlib/default.nixdiffbeforeafterboth
before · lib/default.nix
1{ flake-utils }: {2  fleetConfiguration = { data, nixpkgs, hosts, ... }@allConfig:3    let4      hostNames = nixpkgs.lib.attrNames hosts;5      config = builtins.removeAttrs allConfig [ "nixpkgs" "data" ];6      fleetLib = import ./fleetLib.nix {7        inherit nixpkgs hostNames;8      };9    in10    nixpkgs.lib.genAttrs flake-utils.lib.defaultSystems (system:11      let12        root = nixpkgs.lib.evalModules {13          modules = (import ../modules/fleet/_modules.nix) ++ [ config data ];14          specialArgs = {15            inherit nixpkgs fleetLib;16          };17        };18        failedAssertions = map (x: x.message) (nixpkgs.lib.filter (x: !x.assertion) root.config.assertions);19        rootAssertWarn =20          if failedAssertions != [ ]21          then throw "Failed assertions:\n${nixpkgs.lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"22          else nixpkgs.lib.showWarnings root.config.warnings root;23      in24      rec {25        configuredHosts = rootAssertWarn.config.hosts;26        configuredSecrets = rootAssertWarn.config.secrets;27        configuredSystems = nixpkgs.lib.listToAttrs (28          map29            (30              name: {31                inherit name;32                value = nixpkgs.lib.nixosSystem {33                  system = configuredHosts.${name}.system;34                  modules = configuredHosts.${name}.modules ++ (35                    if configuredHosts.${name}.system == "aarch64-linux" then [ (nixpkgs + "/nixos/modules/installer/sd-card/sd-image-aarch64-installer.nix") ]36                    else [ ]37                  ) ++ [38                    ({ ... }: {39                      nixpkgs.system = system;40                      nixpkgs.localSystem.system = system;41                      nixpkgs.crossSystem = if system == configuredHosts.${name}.system then null else {42                        system = configuredHosts.${name}.system;43                      };44                    })45                  ];46                  specialArgs = {47                    inherit fleetLib;48                    fleet = fleetLib.hostsToAttrs (host: configuredSystems.${host}.config);49                  };50                };51              }52            )53            (builtins.attrNames rootAssertWarn.config.hosts)54        ); #nixpkgs.lib.nixosSystem {}55      });56}
after · lib/default.nix
1{ flake-utils }: {2  fleetConfiguration = { data, nixpkgs, hosts, ... }@allConfig:3    let4      hostNames = nixpkgs.lib.attrNames hosts;5      config = builtins.removeAttrs allConfig [ "nixpkgs" "data" ];6      fleetLib = import ./fleetLib.nix {7        inherit nixpkgs hostNames;8      };9    in10    nixpkgs.lib.genAttrs flake-utils.lib.defaultSystems (system:11      let12        root = nixpkgs.lib.evalModules {13          modules = (import ../modules/fleet/_modules.nix) ++ [ config data ];14          specialArgs = {15            inherit nixpkgs fleetLib;16          };17        };18        failedAssertions = map (x: x.message) (nixpkgs.lib.filter (x: !x.assertion) root.config.assertions);19        rootAssertWarn =20          if failedAssertions != [ ]21          then throw "Failed assertions:\n${nixpkgs.lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"22          else nixpkgs.lib.showWarnings root.config.warnings root;23        configuredHosts = rootAssertWarn.config.hosts;24        configuredSecrets = rootAssertWarn.config.secrets;25        configuredSystems = configuredSystemsWithExtraModules [ ];26        configuredSystemsWithExtraModules = extraModules: nixpkgs.lib.listToAttrs (27          map28            (29              name: {30                inherit name;31                value = nixpkgs.lib.nixosSystem {32                  system = configuredHosts.${name}.system;33                  modules = configuredHosts.${name}.modules ++ extraModules ++ [34                    ({ ... }: {35                      nixpkgs.system = system;36                      nixpkgs.localSystem.system = system;37                      nixpkgs.crossSystem = if system == configuredHosts.${name}.system then null else {38                        system = configuredHosts.${name}.system;39                      };40                    })41                  ];42                  specialArgs = {43                    inherit fleetLib;44                    fleet = fleetLib.hostsToAttrs (host: configuredSystems.${host}.config);45                  };46                };47              }48            )49            (builtins.attrNames rootAssertWarn.config.hosts)50        );51      in52      rec {53        inherit configuredHosts configuredSecrets configuredSystems;54        buildSystems = {55          toplevel = builtins.mapAttrs (_name: value: value.config.system.build.toplevel) (configuredSystemsWithExtraModules [ ]);56          sdImage = builtins.mapAttrs (_name: value: value.config.system.build.sdImage) (configuredSystemsWithExtraModules [57            (nixpkgs + "/nixos/modules/installer/sd-card/sd-image-aarch64-installer.nix")58          ]);59          installationCd = builtins.mapAttrs (_name: value: value.config.system.build.isoImage) (configuredSystemsWithExtraModules [60            (nixpkgs + "/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix")61            ({ lib, ... }: {62              # Needed for https://github.com/NixOS/nixpkgs/issues/5895963              boot.supportedFilesystems = lib.mkForce [ "btrfs" "reiserfs" "vfat" "f2fs" "xfs" "ntfs" "cifs" ];64            })65          ]);66        };67      });68}