fix: Create lock on docker setup to prevent race conditions
This commit is contained in:
parent
33f0ff1bfa
commit
a3c5b6f06b
1 changed files with 18 additions and 2 deletions
|
|
@ -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(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue