168 lines
4.4 KiB
Rust
168 lines
4.4 KiB
Rust
/*!
|
||
# 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);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|