feat: Include base image information in labels
This commit is contained in:
parent
3674f83fd2
commit
e3b246ef91
10 changed files with 246 additions and 193 deletions
|
|
@ -13,6 +13,7 @@ use blue_build_utils::{
|
|||
credentials::Credentials,
|
||||
string_vec,
|
||||
};
|
||||
use cached::proc_macro::cached;
|
||||
use log::{debug, info, trace, warn};
|
||||
use miette::{bail, IntoDiagnostic, Result};
|
||||
use once_cell::sync::Lazy;
|
||||
|
|
@ -346,46 +347,56 @@ impl BuildDriver for DockerDriver {
|
|||
|
||||
impl InspectDriver for DockerDriver {
|
||||
fn get_metadata(opts: &GetMetadataOpts) -> Result<ImageMetadata> {
|
||||
trace!("DockerDriver::get_metadata({opts:#?})");
|
||||
|
||||
let url = opts.tag.as_ref().map_or_else(
|
||||
|| format!("{}", opts.image),
|
||||
|tag| format!("{}:{tag}", opts.image),
|
||||
);
|
||||
|
||||
let mut command = cmd!(
|
||||
"docker",
|
||||
"buildx",
|
||||
|command|? {
|
||||
if !env::var(DOCKER_HOST).is_ok_and(|dh| !dh.is_empty()) {
|
||||
Self::setup()?;
|
||||
cmd!(command, "--builder=bluebuild");
|
||||
}
|
||||
},
|
||||
"imagetools",
|
||||
"inspect",
|
||||
"--format",
|
||||
"{{json .}}",
|
||||
&url
|
||||
);
|
||||
trace!("{command:?}");
|
||||
|
||||
let output = command.output().into_diagnostic()?;
|
||||
|
||||
if output.status.success() {
|
||||
info!("Successfully inspected image {url}!");
|
||||
} else {
|
||||
bail!("Failed to inspect image {url}")
|
||||
}
|
||||
|
||||
serde_json::from_slice::<DockerImageMetadata>(&output.stdout)
|
||||
.into_diagnostic()
|
||||
.inspect(|metadata| trace!("{metadata:#?}"))
|
||||
.map(ImageMetadata::from)
|
||||
.inspect(|metadata| trace!("{metadata:#?}"))
|
||||
get_metadata_cache(opts)
|
||||
}
|
||||
}
|
||||
|
||||
#[cached(
|
||||
result = true,
|
||||
key = "String",
|
||||
convert = r#"{ format!("{}-{:?}-{}", &*opts.image, opts.tag.as_ref(), opts.platform)}"#,
|
||||
sync_writes = true
|
||||
)]
|
||||
fn get_metadata_cache(opts: &GetMetadataOpts) -> Result<ImageMetadata> {
|
||||
trace!("DockerDriver::get_metadata({opts:#?})");
|
||||
|
||||
let url = opts.tag.as_ref().map_or_else(
|
||||
|| format!("{}", opts.image),
|
||||
|tag| format!("{}:{tag}", opts.image),
|
||||
);
|
||||
|
||||
let mut command = cmd!(
|
||||
"docker",
|
||||
"buildx",
|
||||
|command|? {
|
||||
if !env::var(DOCKER_HOST).is_ok_and(|dh| !dh.is_empty()) {
|
||||
DockerDriver::setup()?;
|
||||
cmd!(command, "--builder=bluebuild");
|
||||
}
|
||||
},
|
||||
"imagetools",
|
||||
"inspect",
|
||||
"--format",
|
||||
"{{json .}}",
|
||||
&url
|
||||
);
|
||||
trace!("{command:?}");
|
||||
|
||||
let output = command.output().into_diagnostic()?;
|
||||
|
||||
if output.status.success() {
|
||||
info!("Successfully inspected image {url}!");
|
||||
} else {
|
||||
bail!("Failed to inspect image {url}")
|
||||
}
|
||||
|
||||
serde_json::from_slice::<DockerImageMetadata>(&output.stdout)
|
||||
.into_diagnostic()
|
||||
.inspect(|metadata| trace!("{metadata:#?}"))
|
||||
.map(ImageMetadata::from)
|
||||
.inspect(|metadata| trace!("{metadata:#?}"))
|
||||
}
|
||||
|
||||
impl RunDriver for DockerDriver {
|
||||
fn run(opts: &RunOpts) -> std::io::Result<ExitStatus> {
|
||||
let cid_path = TempDir::new()?;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ use bon::Builder;
|
|||
|
||||
use crate::drivers::types::Platform;
|
||||
|
||||
#[derive(Debug, Clone, Builder)]
|
||||
#[derive(Debug, Clone, Builder, Hash)]
|
||||
#[builder(derive(Clone))]
|
||||
pub struct GetMetadataOpts<'scope> {
|
||||
#[builder(into)]
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use std::{
|
|||
};
|
||||
|
||||
use blue_build_utils::{cmd, credentials::Credentials};
|
||||
use cached::proc_macro::cached;
|
||||
use colored::Colorize;
|
||||
use indicatif::{ProgressBar, ProgressStyle};
|
||||
use log::{debug, error, info, trace, warn};
|
||||
|
|
@ -251,61 +252,71 @@ impl BuildDriver for PodmanDriver {
|
|||
|
||||
impl InspectDriver for PodmanDriver {
|
||||
fn get_metadata(opts: &GetMetadataOpts) -> Result<ImageMetadata> {
|
||||
trace!("PodmanDriver::get_metadata({opts:#?})");
|
||||
|
||||
let url = opts.tag.as_deref().map_or_else(
|
||||
|| format!("{}", opts.image),
|
||||
|tag| format!("{}:{tag}", opts.image),
|
||||
);
|
||||
|
||||
let progress = Logger::multi_progress().add(
|
||||
ProgressBar::new_spinner()
|
||||
.with_style(ProgressStyle::default_spinner())
|
||||
.with_message(format!(
|
||||
"Inspecting metadata for {}, pulling image...",
|
||||
url.bold()
|
||||
)),
|
||||
);
|
||||
progress.enable_steady_tick(Duration::from_millis(100));
|
||||
|
||||
let mut command = cmd!(
|
||||
"podman",
|
||||
"pull",
|
||||
if !matches!(opts.platform, Platform::Native) => [
|
||||
"--platform",
|
||||
opts.platform.to_string(),
|
||||
],
|
||||
&url,
|
||||
);
|
||||
trace!("{command:?}");
|
||||
|
||||
let output = command.output().into_diagnostic()?;
|
||||
|
||||
if !output.status.success() {
|
||||
bail!("Failed to pull {} for inspection!", url.bold());
|
||||
}
|
||||
|
||||
let mut command = cmd!("podman", "image", "inspect", "--format=json", &url);
|
||||
trace!("{command:?}");
|
||||
|
||||
let output = command.output().into_diagnostic()?;
|
||||
|
||||
progress.finish_and_clear();
|
||||
Logger::multi_progress().remove(&progress);
|
||||
|
||||
if output.status.success() {
|
||||
debug!("Successfully inspected image {url}!");
|
||||
} else {
|
||||
bail!("Failed to inspect image {url}");
|
||||
}
|
||||
serde_json::from_slice::<Vec<PodmanImageMetadata>>(&output.stdout)
|
||||
.into_diagnostic()
|
||||
.inspect(|metadata| trace!("{metadata:#?}"))
|
||||
.and_then(TryFrom::try_from)
|
||||
.inspect(|metadata| trace!("{metadata:#?}"))
|
||||
get_metadata_cache(opts)
|
||||
}
|
||||
}
|
||||
|
||||
#[cached(
|
||||
result = true,
|
||||
key = "String",
|
||||
convert = r#"{ format!("{}-{:?}-{}", &*opts.image, opts.tag.as_ref(), opts.platform)}"#,
|
||||
sync_writes = true
|
||||
)]
|
||||
fn get_metadata_cache(opts: &GetMetadataOpts) -> Result<ImageMetadata> {
|
||||
trace!("PodmanDriver::get_metadata({opts:#?})");
|
||||
|
||||
let url = opts.tag.as_deref().map_or_else(
|
||||
|| format!("{}", opts.image),
|
||||
|tag| format!("{}:{tag}", opts.image),
|
||||
);
|
||||
|
||||
let progress = Logger::multi_progress().add(
|
||||
ProgressBar::new_spinner()
|
||||
.with_style(ProgressStyle::default_spinner())
|
||||
.with_message(format!(
|
||||
"Inspecting metadata for {}, pulling image...",
|
||||
url.bold()
|
||||
)),
|
||||
);
|
||||
progress.enable_steady_tick(Duration::from_millis(100));
|
||||
|
||||
let mut command = cmd!(
|
||||
"podman",
|
||||
"pull",
|
||||
if !matches!(opts.platform, Platform::Native) => [
|
||||
"--platform",
|
||||
opts.platform.to_string(),
|
||||
],
|
||||
&url,
|
||||
);
|
||||
trace!("{command:?}");
|
||||
|
||||
let output = command.output().into_diagnostic()?;
|
||||
|
||||
if !output.status.success() {
|
||||
bail!("Failed to pull {} for inspection!", url.bold());
|
||||
}
|
||||
|
||||
let mut command = cmd!("podman", "image", "inspect", "--format=json", &url);
|
||||
trace!("{command:?}");
|
||||
|
||||
let output = command.output().into_diagnostic()?;
|
||||
|
||||
progress.finish_and_clear();
|
||||
Logger::multi_progress().remove(&progress);
|
||||
|
||||
if output.status.success() {
|
||||
debug!("Successfully inspected image {url}!");
|
||||
} else {
|
||||
bail!("Failed to inspect image {url}");
|
||||
}
|
||||
serde_json::from_slice::<Vec<PodmanImageMetadata>>(&output.stdout)
|
||||
.into_diagnostic()
|
||||
.inspect(|metadata| trace!("{metadata:#?}"))
|
||||
.and_then(TryFrom::try_from)
|
||||
.inspect(|metadata| trace!("{metadata:#?}"))
|
||||
}
|
||||
|
||||
impl RunDriver for PodmanDriver {
|
||||
fn run(opts: &RunOpts) -> std::io::Result<ExitStatus> {
|
||||
trace!("PodmanDriver::run({opts:#?})");
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
use std::{process::Stdio, time::Duration};
|
||||
|
||||
use blue_build_utils::cmd;
|
||||
use cached::proc_macro::cached;
|
||||
use colored::Colorize;
|
||||
use indicatif::{ProgressBar, ProgressStyle};
|
||||
use log::{debug, trace};
|
||||
|
|
@ -15,42 +16,52 @@ pub struct SkopeoDriver;
|
|||
|
||||
impl InspectDriver for SkopeoDriver {
|
||||
fn get_metadata(opts: &GetMetadataOpts) -> Result<ImageMetadata> {
|
||||
trace!("SkopeoDriver::get_metadata({opts:#?})");
|
||||
|
||||
let url = opts.tag.as_ref().map_or_else(
|
||||
|| format!("docker://{}", opts.image),
|
||||
|tag| format!("docker://{}:{tag}", opts.image),
|
||||
);
|
||||
|
||||
let progress = Logger::multi_progress().add(
|
||||
ProgressBar::new_spinner()
|
||||
.with_style(ProgressStyle::default_spinner())
|
||||
.with_message(format!("Inspecting metadata for {}", url.bold())),
|
||||
);
|
||||
progress.enable_steady_tick(Duration::from_millis(100));
|
||||
|
||||
let mut command = cmd!(
|
||||
"skopeo",
|
||||
if !matches!(opts.platform, Platform::Native) => [
|
||||
"--override-arch",
|
||||
opts.platform.arch(),
|
||||
],
|
||||
"inspect",
|
||||
&url,
|
||||
stderr = Stdio::inherit(),
|
||||
);
|
||||
trace!("{command:?}");
|
||||
|
||||
let output = command.output().into_diagnostic()?;
|
||||
|
||||
progress.finish_and_clear();
|
||||
Logger::multi_progress().remove(&progress);
|
||||
|
||||
if output.status.success() {
|
||||
debug!("Successfully inspected image {url}!");
|
||||
} else {
|
||||
bail!("Failed to inspect image {url}")
|
||||
}
|
||||
serde_json::from_slice(&output.stdout).into_diagnostic()
|
||||
get_metadata_cache(opts)
|
||||
}
|
||||
}
|
||||
|
||||
#[cached(
|
||||
result = true,
|
||||
key = "String",
|
||||
convert = r#"{ format!("{}-{:?}-{}", &*opts.image, opts.tag.as_ref(), opts.platform)}"#,
|
||||
sync_writes = true
|
||||
)]
|
||||
fn get_metadata_cache(opts: &GetMetadataOpts) -> Result<ImageMetadata> {
|
||||
trace!("SkopeoDriver::get_metadata({opts:#?})");
|
||||
|
||||
let url = opts.tag.as_ref().map_or_else(
|
||||
|| format!("docker://{}", opts.image),
|
||||
|tag| format!("docker://{}:{tag}", opts.image),
|
||||
);
|
||||
|
||||
let progress = Logger::multi_progress().add(
|
||||
ProgressBar::new_spinner()
|
||||
.with_style(ProgressStyle::default_spinner())
|
||||
.with_message(format!("Inspecting metadata for {}", url.bold())),
|
||||
);
|
||||
progress.enable_steady_tick(Duration::from_millis(100));
|
||||
|
||||
let mut command = cmd!(
|
||||
"skopeo",
|
||||
if !matches!(opts.platform, Platform::Native) => [
|
||||
"--override-arch",
|
||||
opts.platform.arch(),
|
||||
],
|
||||
"inspect",
|
||||
&url,
|
||||
stderr = Stdio::inherit(),
|
||||
);
|
||||
trace!("{command:?}");
|
||||
|
||||
let output = command.output().into_diagnostic()?;
|
||||
|
||||
progress.finish_and_clear();
|
||||
Logger::multi_progress().remove(&progress);
|
||||
|
||||
if output.status.success() {
|
||||
debug!("Successfully inspected image {url}!");
|
||||
} else {
|
||||
bail!("Failed to inspect image {url}")
|
||||
}
|
||||
serde_json::from_slice(&output.stdout).into_diagnostic()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue