feat: use config json

This commit is contained in:
2020-11-15 12:40:15 +08:00
parent f6efe6ec59
commit 7f01fc75cb
5 changed files with 74 additions and 30 deletions

View File

@@ -1,3 +1,15 @@
# dockerbuild
Docker build tool, build software using docker
Docker build tool, build software using docker
Config file:
* `~/.dockerbuild.json`
* `/etc/dockerbuild.json`
```json
echo '{
"image": "rust:1.47",
"mirror": "git://mirrors.ustc.edu.cn/crates.io-index"
}' > ~/.dockerbuild.json
```

View File

@@ -4,9 +4,9 @@ use rust_util::XResult;
pub enum Builder {
Cargo,
Maven,
Gradle,
Buildj,
// Maven,
// Gradle,
// Buildj,
Unknown,
}
@@ -18,9 +18,9 @@ impl Builder {
pub fn get_name(&self) -> Option<String> {
match self {
Builder::Cargo => Some("cargo".into()),
Builder::Maven => Some("mvn".into()),
Builder::Gradle => Some("gradle".into()),
Builder::Buildj => Some("buildj".into()),
// Builder::Maven => Some("mvn".into()),
// Builder::Gradle => Some("gradle".into()),
// Builder::Buildj => Some("buildj".into()),
Builder::Unknown => None,
}
}
@@ -39,15 +39,15 @@ fn inner_get_builder(opt_current_dir: &Option<String>) -> XResult<Builder> {
if check_files_exists("Cargo.toml") {
return Ok(Builder::Cargo);
}
if check_files_exists("pom.xml") {
return Ok(Builder::Maven);
}
if check_files_exists("build.gradle") {
return Ok(Builder::Gradle);
}
if check_files_exists("build.json") {
return Ok(Builder::Buildj);
}
// if check_files_exists("pom.xml") {
// return Ok(Builder::Maven);
// }
// if check_files_exists("build.gradle") {
// return Ok(Builder::Gradle);
// }
// if check_files_exists("build.json") {
// return Ok(Builder::Buildj);
// }
Ok(Builder::Unknown)
}

View File

@@ -1,6 +1,31 @@
use std::fs;
use std::path::PathBuf;
use serde::{Serialize, Deserialize};
use rust_util::util_file;
#[derive(Serialize, Deserialize)]
pub struct DockerBuildConfig {
image: Option<String>,
pub image: Option<String>,
pub mirror: Option<String>,
}
pub fn load_docker_build_config() -> Option<DockerBuildConfig> {
let config = find_docker_build_config_file()?;
success!("Find config file: {:?}", config);
let config_content = fs::read_to_string(&config).map_err(|e| {
failure!("Read config file: {:?}, failed: {}", config, e);
e
}).ok()?;
serde_json::from_str(&config_content).map_err(|e| {
failure!("Parse config file: {:?}, failed: {}", config, e);
e
}).ok()
}
fn find_docker_build_config_file() -> Option<PathBuf> {
util_file::read_config(None, &vec![
// "dockerbuild.json".into(),
"~/.dockerbuild.json".into(),
"/etc/dockerbuild.json".into(),
])
}

View File

@@ -24,6 +24,7 @@ pub struct DockerCmd {
impl DockerCmd {
pub fn new(docker_name: &str) -> Self {
success!("Docker image: {}", docker_name);
Self {
docker_name: docker_name.into(),
..Default::default()
@@ -128,7 +129,7 @@ fn escape_arg(arg: &str) -> String {
let mut r = String::with_capacity(arg.len() + 10);
r.push('\'');
for c in arg.chars() {
if c == '\'' {
if c == '\'' || c == '\\' {
r.push('\\');
}
r.push(c);

View File

@@ -11,32 +11,38 @@ use std::path::{Path, PathBuf};
use rust_util::util_file;
pub use docker_util::DockerCmd;
const MIRROR_USTC: &str = "git://mirrors.ustc.edu.cn/crates.io-index";
fn main() {
information!("dockerbuild v0.1");
let docker_image = "rust:1.47";
let docker_build_config = config::load_docker_build_config().expect("Read config failed, not found or parse error!");
let docker_image = &docker_build_config.image.expect("Image is not configed in config file!");
let docker_registry_path_buf =get_resolved_docker_registry(docker_image).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;
}
}
check_docker_registry_exists(&docker_registry).expect("Check docker registry exists failed!");
let args_iter = env::args().skip(1);
let args = args_iter.map(|a| a.to_owned()).collect::<Vec<_>>();
let mut docker_cmd = DockerCmd::new(docker_image);
docker_cmd.add_volumn(docker_registry, "/usr/local/cargo/registry")
.mirror(MIRROR_USTC);
docker_cmd.add_volumn(docker_registry, "/usr/local/cargo/registry");
if let Some(mirror) = &docker_build_config.mirror {
docker_cmd.mirror(mirror);
}
docker_cmd.exec(&args).unwrap();
}
fn check_docker_registry_exists(docker_registry: &str) -> Option<()> {
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 None;
}
}
Some(())
}
fn get_resolved_docker_registry(image: &str) -> Option<PathBuf> {
util_file::get_absolute_path(&get_docker_registry(image))
}