summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-09 22:37:35 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-10-20 23:54:57 +0200
commitd3865570b67f8a7a3f2acd3ec96e722d7e0dae8e (patch)
tree9396a63d8cd5ad2eee19df8ce6433af52f15fe3d
parentaafb26596ba2631fb1edb3ee5f0e9ae18633927b (diff)
downloadrebel-d3865570b67f8a7a3f2acd3ec96e722d7e0dae8e.tar
rebel-d3865570b67f8a7a3f2acd3ec96e722d7e0dae8e.zip
container: write task command to script file
-rw-r--r--src/paths.rs4
-rw-r--r--src/runner/container/task.rs21
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);