Skip to main content

eol_deployer/
cli.rs

1use crate::config::Config;
2use crate::deployment_manager::DeploymentManager;
3use clap::Parser;
4
5#[derive(Parser)]
6pub struct CLI {
7    #[arg(value_name = "TAG", index = 1)]
8    pub tag: String,
9    #[arg(short, long)]
10    pub name: Option<String>,
11    #[arg(short, long, default_value = "/var/run/docker.sock")]
12    pub socket_path: String,
13    #[arg(
14        short,
15        long,
16        default_value = "https://bitbucket.org:financialpayments/plain-jane-proxy.git"
17    )]
18    pub repo_url: Option<String>,
19    #[arg(short, long, default_value = "/etc/traefik")]
20    pub mount_path: Option<String>,
21}
22
23// Main application logic
24pub async fn deploy(cli: &CLI) {
25    // Load configuration from CLI args and/or .env file
26    let config = match Config::from_env_and_cli(cli) {
27        Ok(config) => {
28            println!("Configuration loaded:");
29            println!("  Repository: {}", config.repo_url);
30            println!("  Mount path: {}", config.mount_path);
31            config
32        }
33        Err(e) => {
34            eprintln!("Configuration error: {}", e);
35            println!();
36            Config::show_configuration_help();
37            return;
38        }
39    };
40
41    let deployment_manager = DeploymentManager::new(cli.socket_path.clone());
42
43    if let Some(project_name) = &cli.name {
44        println!(
45            "Starting deployment for project '{}' with tag '{}'",
46            project_name, cli.tag
47        );
48
49        match deployment_manager
50            .rolling_deploy(project_name, &cli.tag, &config)
51            .await
52        {
53            Ok(()) => println!("Rolling deployment successful!"),
54            Err(e) => eprintln!("Rolling deployment failed: {}", e),
55        }
56    } else {
57        eprintln!("Project name is required for deployment. Use --name flag.");
58        println!();
59        println!("Examples:");
60        println!(
61            "  ./app v1.2.3 --name my-traefik-project --repo-url https://github.com/org/repo.git --mount-path /opt/configs"
62        );
63        println!(
64            "  ./app v1.2.3 --name my-traefik-project  # Uses .env file for repo and mount path"
65        );
66    }
67}