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
20 if failedAssertions != [ ]20 if failedAssertions != [ ]
21 then throw "Failed assertions:\n${nixpkgs.lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"21 then throw "Failed assertions:\n${nixpkgs.lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}"
22 else nixpkgs.lib.showWarnings root.config.warnings root;22 else nixpkgs.lib.showWarnings root.config.warnings root;
23 in
24 rec {
25 configuredHosts = rootAssertWarn.config.hosts;23 configuredHosts = rootAssertWarn.config.hosts;
26 configuredSecrets = rootAssertWarn.config.secrets;24 configuredSecrets = rootAssertWarn.config.secrets;
27 configuredSystems = nixpkgs.lib.listToAttrs (25 configuredSystems = configuredSystemsWithExtraModules [ ];
26 configuredSystemsWithExtraModules = extraModules: nixpkgs.lib.listToAttrs (
28 map27 map
29 (28 (
30 name: {29 name: {
31 inherit name;30 inherit name;
32 value = nixpkgs.lib.nixosSystem {31 value = nixpkgs.lib.nixosSystem {
33 system = configuredHosts.${name}.system;32 system = configuredHosts.${name}.system;
34 modules = configuredHosts.${name}.modules ++ (33 modules = configuredHosts.${name}.modules ++ extraModules ++ [
35 if configuredHosts.${name}.system == "aarch64-linux" then [ (nixpkgs + "/nixos/modules/installer/sd-card/sd-image-aarch64-installer.nix") ]
36 else [ ]
37 ) ++ [
38 ({ ... }: {34 ({ ... }: {
39 nixpkgs.system = system;35 nixpkgs.system = system;
40 nixpkgs.localSystem.system = system;36 nixpkgs.localSystem.system = system;
51 }47 }
52 )48 )
53 (builtins.attrNames rootAssertWarn.config.hosts)49 (builtins.attrNames rootAssertWarn.config.hosts)
54 ); #nixpkgs.lib.nixosSystem {}50 );
51 in
52 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/58959
63 boot.supportedFilesystems = lib.mkForce [ "btrfs" "reiserfs" "vfat" "f2fs" "xfs" "ntfs" "cifs" ];
64 })
65 ]);
66 };
55 });67 });
56}68}
5769