feat: use config json
This commit is contained in:
14
README.md
14
README.md
@@ -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
|
||||
```
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
])
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
30
src/main.rs
30
src/main.rs
@@ -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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user