feat: ssh workflow
This commit is contained in:
+22
-4
@@ -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(())
|
||||
|
||||
Reference in New Issue
Block a user