difftreelog
feat build specializations
in: trunk
2 files changed
cmds/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);
}
lib/default.nixdiffbeforeafterboth1{ 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.${}.system;34 modules = configuredHosts.${}.modules ++ (35 if configuredHosts.${}.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.${}.system then null else {42 system = configuredHosts.${}.system;43 };44 })45 ];46 specialArgs = {47 inherit fleetLib;48 fleet = fleetLib.hostsToAttrs (host: configuredSystems.${}.config);49 };50 };51 }52 )53 (builtins.attrNames rootAssertWarn.config.hosts)54 ); #nixpkgs.lib.nixosSystem {}55 });56}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.${}.system;33 modules = configuredHosts.${}.modules ++ extraModules ++ [34 ({ ... }: {35 nixpkgs.system = system;36 nixpkgs.localSystem.system = system;37 nixpkgs.crossSystem = if system == configuredHosts.${}.system then null else {38 system = configuredHosts.${}.system;39 };40 })41 ];42 specialArgs = {43 inherit fleetLib;44 fleet = fleetLib.hostsToAttrs (host: configuredSystems.${}.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}