diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/executor.rs | 2 | ||||
-rw-r--r-- | src/runner/buildah.rs | 50 |
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(()) } |