NAC_Blockchain/nac-deploy/src/main.rs

168 lines
4.4 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*!
# NAC智能部署工具
NAC区块链节点和服务的智能部署管理工具。
## 功能特性
- ✅ 多环境部署(开发、测试、生产)
- ✅ 配置模板管理
- ✅ 健康检查
- ✅ 回滚机制
- ✅ 日志收集
## 使用示例
```bash
# 部署到开发环境
nac-deploy deploy --env dev
# 部署到生产环境
nac-deploy deploy --env prod --config prod.toml
# 检查部署状态
nac-deploy status
# 回滚到上一个版本
nac-deploy rollback
```
*/
mod config;
mod deployer;
mod health;
mod rollback;
use clap::{Parser, Subcommand};
use colored::*;
use config::DeployConfig;
use deployer::Deployer;
use health::HealthChecker;
use rollback::RollbackManager;
#[derive(Parser)]
#[command(name = "nac-deploy")]
#[command(about = "NAC智能部署工具", long_about = None)]
#[command(version)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
/// 部署NAC节点
Deploy {
/// 目标环境dev/test/prod
#[arg(short, long, default_value = "dev")]
env: String,
/// 配置文件路径
#[arg(short, long)]
config: Option<String>,
},
/// 检查部署状态
Status {
/// RPC端口
#[arg(short, long, default_value = "8545")]
port: u16,
},
/// 回滚到上一个版本
Rollback {
/// 回滚到指定版本
#[arg(short, long)]
version: Option<String>,
},
/// 生成配置模板
Init {
/// 环境名称
#[arg(short, long, default_value = "dev")]
env: String,
/// 输出文件路径
#[arg(short, long)]
output: Option<String>,
},
}
fn main() {
env_logger::init();
let cli = Cli::parse();
match cli.command {
Commands::Deploy { env, config } => {
println!("{}", "🚀 NAC智能部署工具".bright_cyan().bold());
println!("目标环境: {}", env.bright_yellow());
let deploy_config = if let Some(cfg_path) = config {
println!("配置文件: {}", cfg_path.bright_yellow());
match DeployConfig::load(&cfg_path) {
Ok(cfg) => cfg,
Err(e) => {
eprintln!("{} {}", "❌ 配置加载失败:".bright_red(), e);
std::process::exit(1);
}
}
} else {
DeployConfig::for_env(&env)
};
let deployer = Deployer::new(deploy_config);
if let Err(e) = deployer.deploy() {
eprintln!("{} {}", "❌ 部署失败:".bright_red(), e);
std::process::exit(1);
}
}
Commands::Status { port } => {
println!("{}", "📊 NAC部署状态".bright_cyan().bold());
let checker = HealthChecker::new(port);
match checker.check() {
Ok(_status) => {
println!("{}", "✅ 健康检查完成".bright_green());
}
Err(e) => {
eprintln!("{} {}", "❌ 健康检查失败:".bright_red(), e);
std::process::exit(1);
}
}
}
Commands::Rollback { version } => {
println!("{}", "⏮️ NAC版本回滚".bright_cyan().bold());
let manager = RollbackManager::new("./backups".to_string());
if let Err(e) = manager.rollback(version) {
eprintln!("{} {}", "❌ 回滚失败:".bright_red(), e);
std::process::exit(1);
}
}
Commands::Init { env, output } => {
println!("{}", "📝 生成配置模板".bright_cyan().bold());
println!("环境: {}", env.bright_yellow());
let config = DeployConfig::for_env(&env);
let output_path = output.unwrap_or_else(|| format!("{}.toml", env));
match config.save(&output_path) {
Ok(_) => {
println!("{} {}", "✅ 配置已保存到:".bright_green(), output_path.bright_yellow());
}
Err(e) => {
eprintln!("{} {}", "❌ 配置保存失败:".bright_red(), e);
std::process::exit(1);
}
}
}
}
}