summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/executor.rs2
-rw-r--r--src/runner/buildah.rs50
2 files changed, 46 insertions, 6 deletions
diff --git a/src/executor.rs b/src/executor.rs
index e07b4e3..2523162 100644
--- a/src/executor.rs
+++ b/src/executor.rs
@@ -70,7 +70,7 @@ impl<'a> Executor<'a> {
}
pub fn run(&mut self) -> runner::Result<()> {
- let runner = runner::buildah::RunnerBuildah::new(self.tasks);
+ let runner = runner::buildah::BuildahRunner::new(self.tasks);
while !self.tasks_runnable.is_empty() {
self.run_one(&runner)?;
}
diff --git a/src/runner/buildah.rs b/src/runner/buildah.rs
index a4f0d3b..72a2e5f 100644
--- a/src/runner/buildah.rs
+++ b/src/runner/buildah.rs
@@ -1,21 +1,61 @@
+use scopeguard::defer;
+use std::{
+ io::{Error, ErrorKind},
+ process::{Command, Stdio},
+};
+
use super::*;
use crate::types::*;
-pub struct RunnerBuildah<'a> {
+static IMAGE: &str = "rebel:latest";
+
+pub struct BuildahRunner<'a> {
tasks: &'a TaskMap,
}
-impl<'a> RunnerBuildah<'a> {
+impl<'a> BuildahRunner<'a> {
pub fn new(tasks: &'a TaskMap) -> Self {
- RunnerBuildah { tasks }
+ BuildahRunner { tasks }
}
}
-impl<'a> Runner for RunnerBuildah<'a> {
+fn check_status(output: &std::process::Output, message: &str) -> Result<()> {
+ if output.status.success() {
+ Ok(())
+ } else {
+ Err(Error::new(ErrorKind::Other, message))
+ }
+}
+
+impl<'a> Runner for BuildahRunner<'a> {
fn run(&self, task: &TaskRef) -> Result<()> {
let task_def = self.tasks.get(task).expect("Invalid TaskRef");
- println!("{}: {:?}", task, task_def.run);
+ let buildah_from = Command::new("buildah")
+ .arg("from")
+ .arg("--name")
+ .arg(task)
+ .arg(IMAGE)
+ .output()?;
+ check_status(&buildah_from, "unable to create container")?;
+
+ defer! {
+ let _ = Command::new("buildah")
+ .arg("rm")
+ .arg(task)
+ .stdout(Stdio::null())
+ .output();
+ }
+
+ let buildah_run = Command::new("buildah")
+ .arg("run")
+ .arg(task)
+ .arg("sh")
+ .arg("-c")
+ .arg(&task_def.run)
+ .output()?;
+
+ println!("{}:\n\t{:?}\n\t{:?}", task, task_def, buildah_run);
Ok(())
}