This commit is contained in:
@@ -38,6 +38,20 @@ impl EphemeralContextGuard {
|
|||||||
return Err(format!("mmdebstrap failed for series {}", series).into());
|
return Err(format!("mmdebstrap failed for series {}", series).into());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mount '/dev' inside the chroot
|
||||||
|
let status = context::current()
|
||||||
|
.command("sudo")
|
||||||
|
.arg("mount")
|
||||||
|
.arg("--bind")
|
||||||
|
.arg("/dev")
|
||||||
|
.arg(format!("{}/dev", chroot_path.display()))
|
||||||
|
.status()?;
|
||||||
|
if !status.success() {
|
||||||
|
// Clean up on failure
|
||||||
|
let _ = std::fs::remove_dir_all(&chroot_path);
|
||||||
|
return Err("Failed to mount /dev inside chroot".into());
|
||||||
|
}
|
||||||
|
|
||||||
// Switch to an ephemeral context to build the package in the chroot
|
// Switch to an ephemeral context to build the package in the chroot
|
||||||
context::manager().set_current_ephemeral(Context::new(ContextConfig::Unshare {
|
context::manager().set_current_ephemeral(Context::new(ContextConfig::Unshare {
|
||||||
path: chroot_path.to_string_lossy().to_string(),
|
path: chroot_path.to_string_lossy().to_string(),
|
||||||
@@ -59,6 +73,18 @@ impl Drop for EphemeralContextGuard {
|
|||||||
log::error!("Failed to restore context {}: {}", self.previous_context, e);
|
log::error!("Failed to restore context {}: {}", self.previous_context, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unmount '/dev' inside the chroot
|
||||||
|
let status = context::current()
|
||||||
|
.command("sudo")
|
||||||
|
.arg("umount")
|
||||||
|
.arg(format!("{}/dev", &self.chroot_path.display()))
|
||||||
|
.status();
|
||||||
|
if status.is_err() || !status.unwrap().success() {
|
||||||
|
// If we fail to umount, then we can't remove (would remove /dev/xx on host)
|
||||||
|
log::error!("Failed to umount /dev inside chroot. Not cleaning up.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Remove chroot directory
|
// Remove chroot directory
|
||||||
// We use the restored context to execute the cleanup command
|
// We use the restored context to execute the cleanup command
|
||||||
let result = context::current()
|
let result = context::current()
|
||||||
|
|||||||
@@ -52,6 +52,11 @@ pub fn build(
|
|||||||
.arg("fakeroot");
|
.arg("fakeroot");
|
||||||
if cross {
|
if cross {
|
||||||
cmd.arg(format!("crossbuild-essential-{arch}"));
|
cmd.arg(format!("crossbuild-essential-{arch}"));
|
||||||
|
cmd.arg(format!("libc6-{arch}-cross"));
|
||||||
|
cmd.arg(format!("libc6-dev-{arch}-cross"));
|
||||||
|
cmd.arg("dpkg-cross");
|
||||||
|
cmd.arg(format!("libc6:{arch}"));
|
||||||
|
cmd.arg(format!("libc6-dev:{arch}"));
|
||||||
}
|
}
|
||||||
let status = cmd.status()?;
|
let status = cmd.status()?;
|
||||||
if !status.success() {
|
if !status.success() {
|
||||||
|
|||||||
@@ -144,4 +144,10 @@ mod tests {
|
|||||||
async fn test_deb_hello_ubuntu_end_to_end() {
|
async fn test_deb_hello_ubuntu_end_to_end() {
|
||||||
test_build_end_to_end("hello", "noble", None, false).await;
|
test_build_end_to_end("hello", "noble", None, false).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[cfg(target_arch = "x86_64")]
|
||||||
|
async fn test_deb_hello_ubuntu_cross_end_to_end() {
|
||||||
|
test_build_end_to_end("hello", "noble", Some("riscv64"), true).await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user