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

difftreelog

feat build sd-image

Yaroslav Bolyukin2021-11-13parent: #440870d.patch.diff
in: trunk

3 files changed

modifiedcmds/fleet/src/cmds/build_systems.rsdiffbeforeafterboth
before · cmds/fleet/src/cmds/build_systems.rs
1use std::process::Command;23use crate::{command::CommandExt, host::Config, nix::SYSTEMS_ATTRIBUTE};4use anyhow::Result;5use log::info;6use structopt::StructOpt;78#[derive(StructOpt)]9pub struct BuildSystems {10	/// --builders arg for nix11	#[structopt(long)]12	builders: Option<String>,13	/// Jobs to run locally14	#[structopt(long)]15	jobs: Option<usize>,16	/// Do not continue on error17	#[structopt(long)]18	fail_fast: bool,19	#[structopt(long)]20	privileged_build: bool,21	#[structopt(subcommand)]22	subcommand: Option<Subcommand>,23}2425#[derive(StructOpt)]26enum Subcommand {27	/// Switch to built system until reboot28	Test,29	/// Switch to built system after reboot30	Boot,31	/// test + boot32	Switch,33}34impl Subcommand {35	fn should_switch_profile(&self) -> bool {36		matches!(self, Self::Test | Self::Switch)37	}38	fn name(&self) -> &'static str {39		match self {40			Self::Test => "test",41			Self::Boot => "boot",42			Self::Switch => "switch",43		}44	}45}4647impl BuildSystems {48	pub fn run(self, config: &Config) -> Result<()> {49		let hosts = config.list_hosts()?;5051		for host in hosts.iter() {52			if config.should_skip(host) {53				continue;54			}55			info!("Building host {}", host);56			let built = {57				let dir = tempfile::tempdir()?;58				dir.path().to_owned()59			};6061			let mut nix_build = if self.privileged_build {62				let mut out = Command::new("sudo");63				out.arg("nix");64				out65			} else {66				Command::new("nix")67			};68			nix_build69				.args(&["build", "--impure", "--no-link", "--out-link"])70				.arg(&built)71				.arg(format!(72					"{}.{}.config.system.build.toplevel",73					SYSTEMS_ATTRIBUTE, host,74				));7576			if let Some(builders) = &self.builders {77				nix_build.arg("--builders").arg(builders);78			}79			if let Some(jobs) = &self.jobs {80				nix_build.arg("--max-jobs");81				nix_build.arg(format!("{}", jobs));82			}83			if !self.fail_fast {84				nix_build.arg("--keep-going");85			}8687			nix_build.inherit_stdio().run()?;88			let built = std::fs::canonicalize(built)?;89			info!("Built closure: {:?}", built);90			if !config.is_local(host) {91				info!("Uploading system closure");92				Command::new("nix")93					.args(&["copy", "--to"])94					.arg(format!("ssh://root@{}", host))95					.arg(&built)96					.inherit_stdio()97					.run()?;98			}99			if let Some(subcommand) = &self.subcommand {100				if subcommand.should_switch_profile() {101					info!("Switching generation");102					config103						.command_on(host, "nix-env", true)104						.args(&["-p", "/nix/var/nix/profiles/system", "--set"])105						.arg(&built)106						.inherit_stdio()107						.run()?;108				}109				info!("Executing activation script");110				let mut switch_script = built.clone();111				switch_script.push("bin");112				switch_script.push("switch-to-configuration");113				config114					.command_on(host, switch_script, true)115					.arg(subcommand.name())116					.inherit_stdio()117					.run()?;118			}119		}120		Ok(())121	}122}
after · cmds/fleet/src/cmds/build_systems.rs
1use std::{env::current_dir, process::Command};23use crate::{command::CommandExt, host::Config, nix::SYSTEMS_ATTRIBUTE};4use anyhow::Result;5use log::info;6use structopt::StructOpt;78#[derive(StructOpt)]9pub struct BuildSystems {10	/// --builders arg for nix11	#[structopt(long)]12	builders: Option<String>,13	/// Jobs to run locally14	#[structopt(long)]15	jobs: Option<usize>,16	/// Do not continue on error17	#[structopt(long)]18	fail_fast: bool,19	#[structopt(long)]20	privileged_build: bool,21	#[structopt(subcommand)]22	subcommand: Subcommand,23}2425enum UploadAction {26	Test,27	Boot,28	Switch,29}30impl UploadAction {31	fn name(&self) -> &'static str {32		match self {33			UploadAction::Test => "test",34			UploadAction::Boot => "boot",35			UploadAction::Switch => "switch",36		}37	}3839	pub(crate) fn should_switch_profile(&self) -> bool {40		matches!(self, Self::Switch | Self::Test)41	}42}4344enum PackageAction {45	SdImage,46}4748enum Action {49	Upload(Option<UploadAction>),50	Package(PackageAction),51}5253impl From<Subcommand> for Action {54	fn from(s: Subcommand) -> Self {55		match s {56			Subcommand::Upload => Self::Upload(None),57			Subcommand::Test => Self::Upload(Some(UploadAction::Test)),58			Subcommand::Boot => Self::Upload(Some(UploadAction::Boot)),59			Subcommand::Switch => Self::Upload(Some(UploadAction::Switch)),60			Subcommand::SdImage => Self::Package(PackageAction::SdImage),61		}62	}63}6465#[derive(StructOpt, Clone)]66enum Subcommand {67	/// Upload, but do not switch68	Upload,69	/// Upload + switch to built system until reboot70	Test,71	/// Upload + switch to built system after reboot72	Boot,73	/// Upload + test + boot74	Switch,7576	/// Build sd image77	SdImage,78}7980impl BuildSystems {81	pub fn run(self, config: &Config) -> Result<()> {82		let hosts = config.list_hosts()?;8384		for host in hosts.iter() {85			if config.should_skip(host) {86				continue;87			}88			info!("Building host {}", host);89			let built = {90				let dir = tempfile::tempdir()?;91				dir.path().to_owned()92			};9394			let mut nix_build = if self.privileged_build {95				let mut out = Command::new("sudo");96				out.arg("nix");97				out98			} else {99				Command::new("nix")100			};101			nix_build102				.args(&["build", "--impure", "--no-link", "--out-link"])103				.arg(&built)104				.arg(format!(105					"{}.{}.config.system.build.toplevel",106					SYSTEMS_ATTRIBUTE, host,107				));108109			if let Some(builders) = &self.builders {110				nix_build.arg("--builders").arg(builders);111			}112			if let Some(jobs) = &self.jobs {113				nix_build.arg("--max-jobs");114				nix_build.arg(format!("{}", jobs));115			}116			if !self.fail_fast {117				nix_build.arg("--keep-going");118			}119120			nix_build.inherit_stdio().run()?;121			let built = std::fs::canonicalize(built)?;122			info!("Built closure: {:?}", built);123124			let action = Action::from(self.subcommand.clone());125126			match action {127				Action::Upload(action) => {128					if !config.is_local(host) {129						info!("Uploading system closure");130						Command::new("nix")131							.args(&["copy", "--to"])132							.arg(format!("ssh://root@{}", host))133							.arg(&built)134							.inherit_stdio()135							.run()?;136					}137					if let Some(action) = action {138						if action.should_switch_profile() {139							info!("Switching generation");140							config141								.command_on(host, "nix-env", true)142								.args(&["-p", "/nix/var/nix/profiles/system", "--set"])143								.arg(&built)144								.inherit_stdio()145								.run()?;146						}147						info!("Executing activation script");148						let mut switch_script = built.clone();149						switch_script.push("bin");150						switch_script.push("switch-to-configuration");151						config152							.command_on(host, switch_script, true)153							.arg(action.name())154							.inherit_stdio()155							.run()?;156					}157				}158				Action::Package(PackageAction::SdImage) => {159					let mut out = current_dir()?;160					out.push(format!("sd-image-{}", host));161162					info!("Building sd image to {:?}", out);163					let mut nix_build = if self.privileged_build {164						let mut out = Command::new("sudo");165						out.arg("nix");166						out167					} else {168						Command::new("nix")169					};170					nix_build171						.args(&["build", "--impure", "--no-link", "--out-link"])172						.arg(&out)173						.arg(format!(174							"{}.{}.config.system.build.sdImage",175							SYSTEMS_ATTRIBUTE, host,176						));177					if let Some(builders) = &self.builders {178						nix_build.arg("--builders").arg(builders);179					}180					if let Some(jobs) = &self.jobs {181						nix_build.arg("--max-jobs");182						nix_build.arg(format!("{}", jobs));183					}184					if !self.fail_fast {185						nix_build.arg("--keep-going");186					}187188					nix_build.inherit_stdio().run()?;189				}190			};191		}192		Ok(())193	}194}
modifiedlib/default.nixdiffbeforeafterboth
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -22,8 +22,10 @@
               inherit name;
               value = nixpkgs.lib.nixosSystem {
                 system = configuredHosts.${name}.system;
-                modules = configuredHosts.${name}.modules;
-                pkgs = import nixpkgs { 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 [ ]
+                );
               };
             }
           )
modifiedmodules/nixos/fleetPkgs.nixdiffbeforeafterboth
--- a/modules/nixos/fleetPkgs.nix
+++ b/modules/nixos/fleetPkgs.nix
@@ -1 +1,3 @@
-{ ... }: { nixpkgs.overlays = [ (import ../../pkgs) ]; }
+{ ... }: {
+  nixpkgs.overlays = [ (import ../../pkgs) ];
+}