diff options
Diffstat (limited to 'src/runner')
-rw-r--r-- | src/runner/runc.rs | 3 | ||||
-rw-r--r-- | src/runner/runc/run.rs | 16 |
2 files changed, 16 insertions, 3 deletions
diff --git a/src/runner/runc.rs b/src/runner/runc.rs index ded73fa..0964ee9 100644 --- a/src/runner/runc.rs +++ b/src/runner/runc.rs @@ -7,11 +7,14 @@ use std::{io, process}; use ipc_channel::ipc; use nix::{sys::signal, unistd}; use serde::{Deserialize, Serialize}; +use sha2::Sha256; use crate::types::*; use crate::unshare; use crate::util::ipc::CheckDisconnect; +pub type OutputHash = Sha256; + #[derive(Debug, Deserialize, Serialize)] struct Request(TaskRef, Task, ipc::IpcSender<run::Error>); diff --git a/src/runner/runc/run.rs b/src/runner/runc/run.rs index 3fe51e1..14149d2 100644 --- a/src/runner/runc/run.rs +++ b/src/runner/runc/run.rs @@ -11,6 +11,8 @@ use nix::{ unistd, }; use serde::{Deserialize, Serialize}; +use sha2::{digest, Digest}; +use tee_readwrite::TeeWriter; use crate::{ types::*, @@ -18,7 +20,7 @@ use crate::{ util::{self, ToIOResult}, }; -use super::spec; +use super::{spec, OutputHash}; #[derive(Debug, Deserialize, Serialize)] pub enum Error { @@ -67,13 +69,21 @@ fn output_filename(task: TaskRef) -> PathBuf { Path::new("build/state").join(format!("{}.tar", task)) } -fn collect_output(task: TaskRef, task_def: Task) -> Result<(), io::Error> { +fn collect_output(task: TaskRef, task_def: Task) -> Result<digest::Output<OutputHash>, io::Error> { let file = util::unix::create_as( output_filename(task), Some(unshare::BUILD_UID), Some(unshare::BUILD_GID), )?; - util::tar::pack(file, "build/tmp/runc/workdir", task_def.output.iter())?.sync_all() + let hasher = OutputHash::default(); + let writer = TeeWriter::new(file, hasher); + + let writer = util::tar::pack(writer, "build/tmp/runc/workdir", task_def.output.iter())?; + let (file, hasher) = writer.into_inner(); + + file.sync_all()?; + + Ok(hasher.finalize()) } pub fn handle_task(task: TaskRef, task_def: Task) -> Result<(), Error> { |