commit
9575e7f44a
@ -0,0 +1,61 @@
|
||||
|
||||
/target/
|
||||
**/*.rs.bk
|
||||
### Rust template
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
|
||||
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
|
||||
# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock
|
||||
Cargo.lock
|
||||
|
||||
# These are backup files generated by rustfmt
|
||||
### JetBrains template
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff:
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/dictionaries
|
||||
|
||||
# Sensitive or high-churn files:
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.xml
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
|
||||
# Gradle:
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# CMake
|
||||
cmake-build-debug/
|
||||
|
||||
# Mongo Explorer plugin:
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
## File-based project format:
|
||||
*.iws
|
||||
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# project file
|
||||
cargo-remote.iml
|
@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "cargo-remote"
|
||||
version = "0.1.0"
|
||||
authors = ["Sebastian Geisler <sgeisler@agdsn.de>"]
|
||||
|
||||
[dependencies]
|
||||
structopt = "0.1.6"
|
||||
structopt-derive = "0.1.6"
|
||||
cargo_metadata = "0.4.0"
|
||||
log = "0.4.1"
|
||||
simple_logger = "0.4.0"
|
@ -0,0 +1,101 @@
|
||||
extern crate structopt;
|
||||
#[macro_use]
|
||||
extern crate structopt_derive;
|
||||
|
||||
extern crate cargo_metadata;
|
||||
|
||||
#[macro_use] extern crate log;
|
||||
extern crate simple_logger;
|
||||
|
||||
use std::process::{exit, Command, Stdio};
|
||||
use std::ffi::OsString;
|
||||
use std::path::Path;
|
||||
|
||||
use structopt::StructOpt;
|
||||
|
||||
#[derive(StructOpt, Debug)]
|
||||
#[structopt(name = "cargo remote")]
|
||||
struct Opts {
|
||||
// workaround for "remote" argument when calling "cargo remote"
|
||||
_unused: String,
|
||||
#[structopt(subcommand)]
|
||||
command: Cmd,
|
||||
#[structopt(short = "r", long = "remote", help = "remote ssh build server")]
|
||||
remote: String
|
||||
}
|
||||
|
||||
#[derive(StructOpt, Debug)]
|
||||
enum Cmd {
|
||||
#[structopt(name="build", help = "Build cargo project remotely and copy back target folder")]
|
||||
Build,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
simple_logger::init().unwrap();
|
||||
|
||||
let options = Opts::from_args();
|
||||
// TODO: add manifest_path option
|
||||
let project_metadata = cargo_metadata::metadata(None).unwrap_or_else(|e| {
|
||||
error!("Could not read cargo metadata: {}", e);
|
||||
exit(-1);
|
||||
});
|
||||
|
||||
// for now, assume that there is only one project and find it's root directory
|
||||
let (project_dir, project_name) = project_metadata.packages.first().map_or_else(|| {
|
||||
error!("No project found.");
|
||||
exit(-2);
|
||||
}, |project| {
|
||||
(
|
||||
Path::new(&project.manifest_path).parent().expect("Cargo.toml seems to have no parent directory?"),
|
||||
&project.name
|
||||
)
|
||||
});
|
||||
|
||||
let build_server = options.remote;
|
||||
|
||||
match options.command {
|
||||
Build => {
|
||||
info!("Transferring sources to build server.");
|
||||
// transfer project to build server
|
||||
Command::new("rsync")
|
||||
.arg("-a")
|
||||
.arg("--delete")
|
||||
.arg("--info=progress2")
|
||||
.arg("--exclude")
|
||||
.arg("target")
|
||||
.arg(format!("{}/", project_dir.to_string_lossy()))
|
||||
.arg(format!("{}:/tmp/remote-build-{}/", build_server, project_name))
|
||||
.stdout(Stdio::inherit())
|
||||
.stderr(Stdio::inherit())
|
||||
.stdin(Stdio::inherit())
|
||||
.output()
|
||||
.expect("failed to transfer project to build server");
|
||||
|
||||
let build_command = format!("cd /tmp/remote-build-{}/; $HOME/.cargo/bin/cargo build", project_name);
|
||||
|
||||
info!("Starting build process.");
|
||||
Command::new("ssh")
|
||||
.arg(&build_server)
|
||||
.arg(build_command)
|
||||
.stdout(Stdio::inherit())
|
||||
.stderr(Stdio::inherit())
|
||||
.stdin(Stdio::inherit())
|
||||
.output()
|
||||
.expect("failed to build project");
|
||||
|
||||
info!("Transferring artifacts back to client.");
|
||||
Command::new("rsync")
|
||||
.arg("-a")
|
||||
.arg("--delete")
|
||||
.arg("--info=progress2")
|
||||
.arg(format!("{}:/tmp/remote-build-{}/target/", build_server, project_name))
|
||||
.arg(format!("{}/target/", project_dir.to_string_lossy()))
|
||||
.stdout(Stdio::inherit())
|
||||
.stderr(Stdio::inherit())
|
||||
.stdin(Stdio::inherit())
|
||||
.output()
|
||||
.expect("failed to transfer built project to client");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue