fix: Create lock on docker setup to prevent race conditions

This commit is contained in:
Gerald Pinder 2024-05-14 10:14:04 -04:00
parent 33f0ff1bfa
commit a3c5b6f06b

View file

@ -1,11 +1,13 @@
use std::{ use std::{
env, env,
process::{Command, Stdio}, process::{Command, Stdio},
sync::Mutex,
}; };
use anyhow::{bail, Result}; use anyhow::{anyhow, bail, Result};
use blue_build_utils::constants::{BB_BUILDKIT_CACHE_GHA, CONTAINER_FILE, SKOPEO_IMAGE}; use blue_build_utils::constants::{BB_BUILDKIT_CACHE_GHA, CONTAINER_FILE, SKOPEO_IMAGE};
use log::{info, trace, warn}; use log::{info, trace, warn};
use once_cell::sync::Lazy;
use semver::Version; use semver::Version;
use serde::Deserialize; use serde::Deserialize;
@ -29,6 +31,8 @@ struct DockerVersionJson {
pub client: DockerVerisonJsonClient, pub client: DockerVerisonJsonClient,
} }
static DOCKER_SETUP: Lazy<Mutex<bool>> = Lazy::new(|| Mutex::new(false));
#[derive(Debug)] #[derive(Debug)]
pub struct DockerDriver; pub struct DockerDriver;
@ -36,6 +40,15 @@ impl DockerDriver {
fn setup() -> Result<()> { fn setup() -> Result<()> {
trace!("DockerDriver::setup()"); trace!("DockerDriver::setup()");
let mut lock = DOCKER_SETUP
.lock()
.map_err(|e| anyhow!("Failed to lock DOCKER_SETUP: {e}"))?;
if *lock {
drop(lock);
return Ok(());
}
trace!("docker buildx ls --format={}", "{{.Name}}"); trace!("docker buildx ls --format={}", "{{.Name}}");
let ls_out = Command::new("docker") let ls_out = Command::new("docker")
.arg("buildx") .arg("buildx")
@ -61,10 +74,13 @@ impl DockerDriver {
.arg("--name=bluebuild") .arg("--name=bluebuild")
.output()?; .output()?;
if !create_out.status.success() { if create_out.status.success() {
*lock = true;
} else {
bail!("{}", String::from_utf8_lossy(&create_out.stderr)); bail!("{}", String::from_utf8_lossy(&create_out.stderr));
} }
} }
drop(lock);
Ok(()) Ok(())
} }
} }