diff options
author | notgne2 | 2020-10-23 22:44:52 -0700 |
---|---|---|
committer | notgne2 | 2020-10-23 22:44:52 -0700 |
commit | 72b066b293befec048f6a1b2f8d7a4b103ae4edf (patch) | |
tree | 620f9ff02ef16b0a6f45968a533b2c6ceb14bb93 | |
parent | 4084e0516d3903acd80ca465f9906e5d3bce2659 (diff) |
Add an option to keep build results
-rw-r--r-- | src/main.rs | 27 | ||||
-rw-r--r-- | src/utils/push.rs | 43 |
2 files changed, 54 insertions, 16 deletions
diff --git a/src/main.rs b/src/main.rs index 5d76e3d..1358a83 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,6 +33,13 @@ struct Opts { /// Extra arguments to be passed to nix build extra_build_args: Vec<String>, + /// Keep the build outputs of each built profile + #[clap(short, long)] + keep_result: bool, + /// Location to keep outputs from built profiles in + #[clap(short, long)] + result_path: Option<String>, + /// Override the SSH user with the given value #[clap(long)] ssh_user: Option<String>, @@ -71,6 +78,8 @@ async fn push_all_profiles( top_settings: &utils::data::GenericSettings, check_sigs: bool, cmd_overrides: &utils::CmdOverrides, + keep_result: bool, + result_path: Option<&str>, ) -> Result<(), Box<dyn std::error::Error>> { info!("Pushing all profiles for `{}`", node_name); @@ -115,6 +124,8 @@ async fn push_all_profiles( repo, &deploy_data, &deploy_defs, + keep_result, + result_path, ) .await?; } @@ -221,9 +232,7 @@ async fn get_deployment_data( build_command = build_command.arg(extra_arg); } - let build_child = build_command - .stdout(Stdio::piped()) - .spawn()?; + let build_child = build_command.stdout(Stdio::piped()).spawn()?; let build_output = build_child.wait_with_output().await?; @@ -245,6 +254,8 @@ async fn run_deploy( supports_flakes: bool, check_sigs: bool, cmd_overrides: utils::CmdOverrides, + keep_result: bool, + result_path: Option<&str>, ) -> Result<(), Box<dyn std::error::Error>> { match (deploy_flake.node, deploy_flake.profile) { (Some(node_name), Some(profile_name)) => { @@ -274,6 +285,8 @@ async fn run_deploy( deploy_flake.repo, &deploy_data, &deploy_defs, + keep_result, + result_path, ) .await?; @@ -293,6 +306,8 @@ async fn run_deploy( &data.generic_settings, check_sigs, &cmd_overrides, + keep_result, + result_path, ) .await?; @@ -310,6 +325,8 @@ async fn run_deploy( &data.generic_settings, check_sigs, &cmd_overrides, + keep_result, + result_path, ) .await?; } @@ -360,12 +377,16 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> { let data = get_deployment_data(supports_flakes, deploy_flake.repo, &opts.extra_build_args).await?; + let result_path = opts.result_path.as_deref(); + run_deploy( deploy_flake, data, supports_flakes, opts.checksigs, cmd_overrides, + opts.keep_result, + result_path, ) .await?; diff --git a/src/utils/push.rs b/src/utils/push.rs index a82c9d4..5e87d5c 100644 --- a/src/utils/push.rs +++ b/src/utils/push.rs @@ -11,25 +11,27 @@ pub async fn push_profile( repo: &str, deploy_data: &super::DeployData<'_>, deploy_defs: &super::DeployDefs<'_>, + keep_result: bool, + result_path: Option<&str>, ) -> Result<(), Box<dyn std::error::Error>> { info!( "Building profile `{}` for node `{}`", deploy_data.profile_name, deploy_data.node_name ); - let build_exit_status = if supports_flakes { + let mut build_c = if supports_flakes { Command::new("nix") - .arg("build") - .arg("--no-link") - .arg(format!( - "{}#deploy.nodes.{}.profiles.{}.path", - repo, deploy_data.node_name, deploy_data.profile_name - )) - .stdout(Stdio::null()) - .status() - .await? } else { Command::new("nix-build") + }; + + let mut build_command = if supports_flakes { + build_c.arg("build").arg("--no-link").arg(format!( + "{}#deploy.nodes.{}.profiles.{}.path", + repo, deploy_data.node_name, deploy_data.profile_name + )) + } else { + build_c .arg(&repo) .arg("--no-out-link") .arg("-A") @@ -37,11 +39,26 @@ pub async fn push_profile( "deploy.nodes.{}.profiles.{}.path", deploy_data.node_name, deploy_data.profile_name )) - .stdout(Stdio::null()) - .status() - .await? }; + build_command = match (keep_result, supports_flakes) { + (true, _) => { + let result_path = match result_path { + Some(x) => x, + None => "./.deploy-gc", + }; + + build_command.arg("--out-link").arg(format!( + "{}/{}/{}", + result_path, deploy_data.node_name, deploy_data.profile_name + )) + } + (false, false) => build_command.arg("--no-out-link"), + (false, true) => build_command.arg("--no-link"), + }; + + let build_exit_status = build_command.stdout(Stdio::null()).status().await?; + if !build_exit_status.success() { good_panic!("`nix build` failed"); } |