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::{
env,
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 log::{info, trace, warn};
use once_cell::sync::Lazy;
use semver::Version;
use serde::Deserialize;
@ -29,6 +31,8 @@ struct DockerVersionJson {
pub client: DockerVerisonJsonClient,
}
static DOCKER_SETUP: Lazy<Mutex<bool>> = Lazy::new(|| Mutex::new(false));
#[derive(Debug)]
pub struct DockerDriver;
@ -36,6 +40,15 @@ impl DockerDriver {
fn setup() -> Result<()> {
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}}");
let ls_out = Command::new("docker")
.arg("buildx")
@ -61,10 +74,13 @@ impl DockerDriver {
.arg("--name=bluebuild")
.output()?;
if !create_out.status.success() {
if create_out.status.success() {
*lock = true;
} else {
bail!("{}", String::from_utf8_lossy(&create_out.stderr));
}
}
drop(lock);
Ok(())
}
}