From 4e7930a0a4573d2a3ba5b0a4d273e0b6946a80f4 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Fri, 09 Dec 2022 15:36:57 +0000 Subject: [PATCH] feat: build specializations --- --- 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), + Upload { action: Option }, Package(PackageAction), } +impl Action { + fn build_attr(&self) -> String { + match self { + Action::Upload { .. } => "toplevel".to_owned(), + Action::Package(p) => p.build_attr(), + } + } +} impl From 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); } --- a/lib/default.nix +++ b/lib/default.nix @@ -20,21 +20,17 @@ if failedAssertions != [ ] then throw "Failed assertions:\n${nixpkgs.lib.concatStringsSep "\n" (map (x: "- ${x}") failedAssertions)}" else nixpkgs.lib.showWarnings root.config.warnings root; - in - rec { configuredHosts = rootAssertWarn.config.hosts; configuredSecrets = rootAssertWarn.config.secrets; - configuredSystems = nixpkgs.lib.listToAttrs ( + configuredSystems = configuredSystemsWithExtraModules [ ]; + configuredSystemsWithExtraModules = extraModules: nixpkgs.lib.listToAttrs ( map ( name: { inherit name; value = nixpkgs.lib.nixosSystem { system = configuredHosts.${name}.system; - modules = configuredHosts.${name}.modules ++ ( - if configuredHosts.${name}.system == "aarch64-linux" then [ (nixpkgs + "/nixos/modules/installer/sd-card/sd-image-aarch64-installer.nix") ] - else [ ] - ) ++ [ + modules = configuredHosts.${name}.modules ++ extraModules ++ [ ({ ... }: { nixpkgs.system = system; nixpkgs.localSystem.system = system; @@ -51,6 +47,22 @@ } ) (builtins.attrNames rootAssertWarn.config.hosts) - ); #nixpkgs.lib.nixosSystem {} + ); + in + rec { + inherit configuredHosts configuredSecrets configuredSystems; + buildSystems = { + toplevel = builtins.mapAttrs (_name: value: value.config.system.build.toplevel) (configuredSystemsWithExtraModules [ ]); + sdImage = builtins.mapAttrs (_name: value: value.config.system.build.sdImage) (configuredSystemsWithExtraModules [ + (nixpkgs + "/nixos/modules/installer/sd-card/sd-image-aarch64-installer.nix") + ]); + installationCd = builtins.mapAttrs (_name: value: value.config.system.build.isoImage) (configuredSystemsWithExtraModules [ + (nixpkgs + "/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix") + ({ lib, ... }: { + # Needed for https://github.com/NixOS/nixpkgs/issues/58959 + boot.supportedFilesystems = lib.mkForce [ "btrfs" "reiserfs" "vfat" "f2fs" "xfs" "ntfs" "cifs" ]; + }) + ]); + }; }); } -- gitstuff