feat: ssh workflow

This commit is contained in:
2026-08-23 04:53:23 +05:00
parent 1555f0434e
commit 363a4a7e5b
8 changed files with 2119 additions and 105 deletions
+22 -4
View File
@@ -1,6 +1,7 @@
mod cli;
mod config;
mod local;
mod ssh;
use std::process::ExitCode;
@@ -42,8 +43,8 @@ fn run(cli: &cli::Cli) -> Result<()> {
.with_context(|| format!("project '{name}' not found in {}", path.display()))?;
let target = match &project.user {
Some(user) => format!("{user}@{}:{}", project.host, project.port),
None => format!("{}:{}", project.host, project.port),
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)",
@@ -78,11 +79,28 @@ fn run(cli: &cli::Cli) -> Result<()> {
} 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 !project.sync.is_empty() {
println!("stage 4 not implemented yet: SFTP file transfer");
}
if !remote_cmds.is_empty() {
println!("stage 3 not implemented yet: SSH remote execution");
if let Some(session) = session.as_mut() {
for cmd in remote_cmds {
session.exec(cmd)?;
}
println!("[Remote] done: {} cmd(s) succeeded", remote_cmds.len());
}
}
Ok(())