feat: add output pipeline
This commit is contained in:
+2
-62
@@ -1,5 +1,6 @@
|
||||
mod cli;
|
||||
mod config;
|
||||
mod deploy;
|
||||
mod local;
|
||||
mod ssh;
|
||||
mod sync;
|
||||
@@ -43,66 +44,5 @@ fn run(cli: &cli::Cli) -> Result<()> {
|
||||
.get(name)
|
||||
.with_context(|| format!("project '{name}' not found in {}", path.display()))?;
|
||||
|
||||
let target = match &project.user {
|
||||
Some(user) => format!("{user}@{}:{}", project.host, project.port.unwrap_or(22)),
|
||||
None => format!("{}:{}", project.host, project.port.unwrap_or(22)),
|
||||
};
|
||||
println!(
|
||||
"deploying '{name}' to {target}: {} local cmd(s), {} sync rule(s), {} remote cmd(s)",
|
||||
project.local.as_ref().map_or(0, |c| c.commands.len()),
|
||||
project.sync.len(),
|
||||
project.remote.as_ref().map_or(0, |c| c.commands.len()),
|
||||
);
|
||||
let local_cmds = project
|
||||
.local
|
||||
.as_ref()
|
||||
.map_or([].as_slice(), |c| c.commands.as_slice());
|
||||
let remote_cmds = project
|
||||
.remote
|
||||
.as_ref()
|
||||
.map_or([].as_slice(), |c| c.commands.as_slice());
|
||||
|
||||
if cli.dry_run {
|
||||
println!("dry-run plan:");
|
||||
for cmd in local_cmds {
|
||||
println!(" local : {cmd}");
|
||||
}
|
||||
for rule in &project.sync {
|
||||
println!(
|
||||
" sync : {} -> {}",
|
||||
rule.source.display(),
|
||||
rule.target.display()
|
||||
);
|
||||
}
|
||||
for cmd in remote_cmds {
|
||||
println!(" remote: {cmd}");
|
||||
}
|
||||
} else {
|
||||
local::run_commands(local_cmds, &project.workdir)?;
|
||||
println!("[Local] done: {} cmd(s) succeeded", local_cmds.len());
|
||||
|
||||
let needs_session = !project.sync.is_empty() || !remote_cmds.is_empty();
|
||||
let mut session = None;
|
||||
if needs_session {
|
||||
let target = ssh::Target {
|
||||
host_alias: project.host.clone(),
|
||||
user: project.user.clone(),
|
||||
port: project.port,
|
||||
key_path: project.key_path.clone(),
|
||||
};
|
||||
let resolved = ssh::resolve(&target)?;
|
||||
session = Some(ssh::connect(&resolved)?);
|
||||
}
|
||||
|
||||
if let Some(session) = session.as_mut() {
|
||||
for rule in &project.sync {
|
||||
sync::upload(session, &rule.source, &rule.target.to_string_lossy())?;
|
||||
}
|
||||
for cmd in remote_cmds {
|
||||
session.exec(cmd)?;
|
||||
}
|
||||
println!("[Remote] done: {} cmd(s) succeeded", remote_cmds.len());
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
deploy::deploy(name, project, cli.dry_run)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user