diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-09 22:37:35 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-20 23:54:57 +0200 |
commit | d3865570b67f8a7a3f2acd3ec96e722d7e0dae8e (patch) | |
tree | 9396a63d8cd5ad2eee19df8ce6433af52f15fe3d | |
parent | aafb26596ba2631fb1edb3ee5f0e9ae18633927b (diff) | |
download | rebel-d3865570b67f8a7a3f2acd3ec96e722d7e0dae8e.tar rebel-d3865570b67f8a7a3f2acd3ec96e722d7e0dae8e.zip |
container: write task command to script file
-rw-r--r-- | src/paths.rs | 4 | ||||
-rw-r--r-- | src/runner/container/task.rs | 21 |
2 files changed, 15 insertions, 10 deletions
diff --git a/src/paths.rs b/src/paths.rs index ffbc3a5..2e8f9f2 100644 --- a/src/paths.rs +++ b/src/paths.rs @@ -31,6 +31,7 @@ //! │ │ ├── downloads/ # downloaded sources //! │ │ ├── dest/ # collected as output after build //! │ │ ├── sysroot/ # sysroot mountpoint +//! │ │ ├── task/ # internal runner files //! │ │ └── work/ # build overlay mountpoint //! │ ├── rootfs/ # rootfs overlay mountpoint //! │ └── depends/ # overlayed on rootfs in container @@ -60,9 +61,12 @@ pub const TASK_STATE_WORK_SUBDIR: &str = "work"; pub const TASK_BUILDDIR: &str = "build"; pub const TASK_DESTDIR: &str = "build/dest"; pub const TASK_DLDIR: &str = "build/downloads"; +pub const TASK_TASKDIR: &str = "build/task"; pub const TASK_WORKDIR: &str = "build/work"; pub const TASK_SYSROOT: &str = "opt/toolchain/sysroot"; +pub const TASK_RUN: &str = "run"; + pub fn join(paths: &[&str]) -> String { paths.join("/") } diff --git a/src/runner/container/task.rs b/src/runner/container/task.rs index 47016a9..09b5f94 100644 --- a/src/runner/container/task.rs +++ b/src/runner/container/task.rs @@ -8,7 +8,6 @@ use std::{ }; use capctl::prctl; -use indoc::formatdoc; use nix::{ mount::{self, MsFlags}, sched::{unshare, CloneFlags}, @@ -48,6 +47,12 @@ fn init_task(input_hash: &InputHash, task: &runner::Task) -> Result<fs::Mount> { let task_tmp_dir = paths::task_tmp_dir(input_hash); + let taskdir = paths::join(&[&task_tmp_dir, paths::TASK_TASKDIR]); + fs::mkdir(&taskdir)?; + let runfile = paths::join(&[&taskdir, paths::TASK_RUN]); + std::fs::write(&runfile, &task.input.command) + .with_context(|| format!("Failed to write {}", runfile))?; + let mount_target = paths::join(&[&task_tmp_dir, paths::TASK_WORKDIR]); let mount = if task.input.inherit.is_empty() { fs::mount(task_layer_dir, &mount_target, None, MsFlags::MS_BIND, None) @@ -216,14 +221,6 @@ fn run_task(input_hash: &InputHash, task: &runner::Task) -> Result<()> { let builddir_source = paths::join(&[&task_tmp_dir, paths::TASK_BUILDDIR]); let builddir_target = paths::join(&[&rootfs, paths::TASK_BUILDDIR]); - let command = formatdoc! {" - INPUT_HASH={input_hash} - - {command}", - input_hash = input_hash, - command = task.input.command, - }; - let log_filename = paths::task_log_filename(input_hash); let exec_cmd = || -> Result<()> { @@ -264,7 +261,10 @@ fn run_task(input_hash: &InputHash, task: &runner::Task) -> Result<()> { ns::setup_userns(BUILD_UID, BUILD_GID, Uid::from_raw(0), Gid::from_raw(0)); let err = Command::new("sh") - .args(&["-exc", &command]) + .args(&[ + "-ex", + &paths::abs(&paths::join(&[paths::TASK_TASKDIR, paths::TASK_RUN])), + ]) .stdin(Stdio::null()) .stdout(log_stdout) .stderr(log_stderr) @@ -272,6 +272,7 @@ fn run_task(input_hash: &InputHash, task: &runner::Task) -> Result<()> { .env_clear() .env("PATH", "/usr/sbin:/usr/bin:/sbin:/bin") .env("HOME", "/build") + .env("INPUT_HASH", input_hash.to_string()) .exec(); eprintln!("{}", err); process::exit(127); |