From 1b28ec7f8ea3f6cc368c69a661ce580061b3a791 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 14 Nov 2020 21:31:13 +0800 Subject: [PATCH] feat: run use temp sub file --- justfile | 8 ++++++ src/docker_util.rs | 66 +++++++++++++++++++++++++++++++++++++++++----- src/main.rs | 23 +++++++++++++++- 3 files changed, 90 insertions(+), 7 deletions(-) create mode 100644 justfile diff --git a/justfile b/justfile new file mode 100644 index 0000000..1f1873e --- /dev/null +++ b/justfile @@ -0,0 +1,8 @@ +# justfile, build bin file + +release: + cargo b --release + +release-linux: + cargo r -- build --release + diff --git a/src/docker_util.rs b/src/docker_util.rs index a144876..19284b4 100644 --- a/src/docker_util.rs +++ b/src/docker_util.rs @@ -15,6 +15,8 @@ pub struct DockerCmd { docker_current_dir: Option, docker_run_uid: Option, docker_run_gid: Option, + volumns: Vec<(String, String)>, + mirror: Option, } impl DockerCmd { @@ -40,6 +42,16 @@ impl DockerCmd { self } + pub fn mirror(&mut self, mirror: &str) -> &mut Self { + self.mirror = Some(mirror.into()); + self + } + + pub fn add_volumn(&mut self, outer_vol: &str, docker_vol: &str) -> &mut Self { + self.volumns.push((outer_vol.into(), docker_vol.into())); + self + } + pub fn exec(self, cmds: &[String]) -> XResult<()> { let mut cmd = Command::new(DOCKER_CMD); cmd.arg("run"); @@ -51,6 +63,10 @@ impl DockerCmd { )); cmd.arg("-v"); cmd.arg(&format!("{}:/usr/src/app", build_util::get_work_dir(&self.docker_current_dir)?)); + for (outer_vol, docker_vol) in self.volumns { + cmd.arg("-v"); + cmd.arg(&format!("{}:{}", outer_vol, docker_vol)); + } cmd.arg("-w"); cmd.arg("/usr/src/app"); cmd.arg(&self.docker_name); @@ -63,20 +79,58 @@ impl DockerCmd { }, }; + let mut sub_cmd = String::new(); + if let Some(mirror) = self.mirror { + sub_cmd.push_str(&make_cmd(&mirror)); + sub_cmd.push_str("\n"); + } + + let mut builder_cmd = builder_name; + let mut sub_build_cmd = vec![]; let mut cmds_iter = cmds.iter(); if let Some(cmd0) = cmds_iter.next() { if cmd0.starts_with(":") { - cmd.arg(&cmd0.chars().skip(1).collect::()); + builder_cmd = cmd0.chars().skip(1).collect::(); } else { - cmd.arg(&builder_name); - cmd.arg(&cmd0); + sub_build_cmd.push(cmd0.clone()); } } else { - cmd.arg(&builder_name); + warning!("Docker build param is empty!"); } - cmds_iter.for_each(|c| { cmd.arg(c); }); + cmds_iter.for_each(|c| { sub_build_cmd.push(c.clone()); }); + + sub_cmd.push_str(&builder_cmd); + sub_cmd.push(' '); + sub_cmd.push_str(&sub_build_cmd.iter().map(|cmd| { + let mut r = String::new(); + r.push('\''); + for c in cmd.chars() { + if c == '\'' { + r.push('\\'); + } + r.push(c); + } + r.push('\''); + r + }).collect::>().join(" ")); + + std::fs::write("temp_sub_cmd", &sub_cmd).ok(); + + cmd.args(vec!["bash", "temp_sub_cmd"]); + information!("Docker cmd exec: {:?}", cmd); + information!("Docker temp sub cmd: {}", sub_cmd); util_cmd::run_command_and_wait(&mut cmd).map_err(|e| e.into()) - // Ok(()) } } + +fn make_cmd(mirror: &str) -> String { + let mut s = String::new(); + s.push_str(&format!(r#"echo '[source.crates-io] + registry = "https://github.com/rust-lang/crates.io-index" + replace-with = "mirror" + [source.mirror] + registry = "{}" + ' > /usr/local/cargo/config"#, mirror)); + s +} diff --git a/src/main.rs b/src/main.rs index 8acdbdf..600c9c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,13 +4,34 @@ extern crate rust_util; mod build_util; mod docker_util; +use std::fs; use std::env; +use std::path::Path; +use rust_util::util_file; pub use docker_util::DockerCmd; +const DOCKER_REGISTRY: &str = "~/.dockerbuild/register/rust_1_47"; +const MIRROR_USTC: &str = "git://mirrors.ustc.edu.cn/crates.io-index"; + fn main() { information!("dockerbuild v0.1"); + let docker_registry_path_buf = util_file::get_absolute_path(DOCKER_REGISTRY).expect("Cannot find $HOME !"); + let docker_registry = docker_registry_path_buf.to_str().expect("Cannot find $HOME !!"); + + let p = Path::new(&docker_registry); + if !p.exists() { + if let Err(e) = fs::create_dir_all(&docker_registry) { + failure!("Create dir failed: {:?}, error: {}", p, e); + return; + } + } + let args_iter = env::args().skip(1); let args = args_iter.map(|a| a.to_owned()).collect::>(); - DockerCmd::new("rust:1.47").exec(&args).unwrap(); + let mut docker_cmd = DockerCmd::new("rust:1.47"); + docker_cmd.add_volumn(docker_registry, "/usr/local/cargo/registry") + .mirror(MIRROR_USTC); + docker_cmd.exec(&args).unwrap(); } +