From 003e473de17cc04f943a97c4b643ad1660324817 Mon Sep 17 00:00:00 2001 From: Gerald Pinder Date: Mon, 10 Feb 2025 18:48:35 -0500 Subject: [PATCH] fix: Use lenient_semver for build drivers version check to handle pre-release versions --- Cargo.lock | 6 ++---- Cargo.toml | 2 +- process/Cargo.toml | 3 +-- process/drivers/buildah_driver.rs | 14 ++++++++------ process/drivers/docker_driver.rs | 4 +++- process/drivers/podman_driver.rs | 14 ++++++++------ process/drivers/traits.rs | 4 ++-- process/drivers/types.rs | 11 +++++++---- utils/Cargo.toml | 2 ++ utils/src/lib.rs | 1 + utils/src/semver.rs | 31 +++++++++++++++++++++++++++++++ 11 files changed, 66 insertions(+), 26 deletions(-) create mode 100644 utils/src/semver.rs diff --git a/Cargo.lock b/Cargo.lock index f5a56209..5e2e5bf7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -411,7 +411,6 @@ dependencies = [ "indexmap 2.7.1", "indicatif", "indicatif-log-bridge", - "lenient_semver", "log", "log4rs", "miette", @@ -481,10 +480,12 @@ dependencies = [ "directories", "docker_credential", "format_serde_error", + "lenient_semver", "log", "miette", "process_control", "rstest", + "semver", "serde", "serde_json", "serde_yml", @@ -4057,9 +4058,6 @@ name = "semver" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" -dependencies = [ - "serde", -] [[package]] name = "serde" diff --git a/Cargo.toml b/Cargo.toml index 4685a8bf..2d41edc5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,10 +19,10 @@ comlexr = "1" indexmap = { version = "2", features = ["serde"] } indicatif = { version = "0.17", features = ["improved_unicode"] } log = "0.4" +miette = "7" nix = { version = "0.29" } oci-distribution = { version = "0.11", default-features = false } reqwest = { version = "0.12", default-features = false, features = ["rustls-tls"] } -miette = "7" rstest = "0.18" semver = "1" serde = { version = "1", features = ["derive"] } diff --git a/process/Cargo.toml b/process/Cargo.toml index b8730f32..e898e6e4 100644 --- a/process/Cargo.toml +++ b/process/Cargo.toml @@ -14,7 +14,6 @@ path = "process.rs" anyhow = "1" blue-build-utils = { version = "=0.9.6", path = "../utils" } indicatif-log-bridge = "0.2" -lenient_semver = "0.4" log4rs = { version = "1", features = ["background_rotation"] } nu-ansi-term = { version = "0.50", features = ["gnu_legacy"] } once_cell = "1" @@ -36,7 +35,7 @@ miette.workspace = true nix = { workspace = true, features = ["signal", "user"] } oci-distribution.workspace = true reqwest.workspace = true -semver = { workspace = true, features = ["serde"] } +semver.workspace = true serde.workspace = true serde_json.workspace = true tempfile.workspace = true diff --git a/process/drivers/buildah_driver.rs b/process/drivers/buildah_driver.rs index 8d6a4f85..124704e5 100644 --- a/process/drivers/buildah_driver.rs +++ b/process/drivers/buildah_driver.rs @@ -1,11 +1,10 @@ use std::{io::Write, process::Stdio}; -use blue_build_utils::credentials::Credentials; +use blue_build_utils::{credentials::Credentials, semver::Version}; use colored::Colorize; use comlexr::cmd; use log::{debug, error, info, trace}; use miette::{bail, miette, IntoDiagnostic, Result}; -use semver::Version; use serde::Deserialize; use crate::{drivers::types::Platform, logging::CommandLogging}; @@ -36,10 +35,13 @@ impl DriverVersion for BuildahDriver { fn version() -> Result { trace!("BuildahDriver::version()"); - trace!("buildah version --json"); - let output = cmd!("buildah", "version", "--json") - .output() - .into_diagnostic()?; + let output = { + let c = cmd!("buildah", "version", "--json"); + trace!("{c:?}"); + c + } + .output() + .into_diagnostic()?; let version_json: BuildahVersionJson = serde_json::from_slice(&output.stdout) .inspect_err(|e| error!("{e}: {}", String::from_utf8_lossy(&output.stdout))) diff --git a/process/drivers/docker_driver.rs b/process/drivers/docker_driver.rs index 4309f76c..17a39f8e 100644 --- a/process/drivers/docker_driver.rs +++ b/process/drivers/docker_driver.rs @@ -8,6 +8,7 @@ use std::{ use blue_build_utils::{ constants::{BB_BUILDKIT_CACHE_GHA, DOCKER_HOST, GITHUB_ACTIONS}, credentials::Credentials, + semver::Version, string_vec, }; use cached::proc_macro::cached; @@ -17,7 +18,6 @@ use log::{debug, info, trace, warn}; use miette::{bail, IntoDiagnostic, Result}; use oci_distribution::Reference; use once_cell::sync::Lazy; -use semver::Version; use serde::Deserialize; use tempfile::TempDir; @@ -124,6 +124,8 @@ impl DriverVersion for DockerDriver { const VERSION_REQ: &'static str = ">=23"; fn version() -> Result { + trace!("DockerDriver::version()"); + let output = { let c = cmd!("docker", "version", "-f", "json"); trace!("{c:?}"); diff --git a/process/drivers/podman_driver.rs b/process/drivers/podman_driver.rs index 8729f50a..30dedb79 100644 --- a/process/drivers/podman_driver.rs +++ b/process/drivers/podman_driver.rs @@ -5,7 +5,7 @@ use std::{ time::Duration, }; -use blue_build_utils::credentials::Credentials; +use blue_build_utils::{credentials::Credentials, semver::Version}; use cached::proc_macro::cached; use colored::Colorize; use comlexr::{cmd, pipe}; @@ -13,7 +13,6 @@ use indicatif::{ProgressBar, ProgressStyle}; use log::{debug, error, info, trace}; use miette::{bail, miette, IntoDiagnostic, Report, Result}; use oci_distribution::Reference; -use semver::Version; use serde::Deserialize; use tempfile::TempDir; @@ -114,10 +113,13 @@ impl DriverVersion for PodmanDriver { fn version() -> Result { trace!("PodmanDriver::version()"); - trace!("podman version -f json"); - let output = cmd!("podman", "version", "-f", "json") - .output() - .into_diagnostic()?; + let output = { + let c = cmd!("podman", "version", "-f", "json"); + trace!("{c:?}"); + c + } + .output() + .into_diagnostic()?; let version_json: PodmanVersionJson = serde_json::from_slice(&output.stdout) .inspect_err(|e| error!("{e}: {}", String::from_utf8_lossy(&output.stdout))) diff --git a/process/drivers/traits.rs b/process/drivers/traits.rs index fe2b60ac..6d7d7fb5 100644 --- a/process/drivers/traits.rs +++ b/process/drivers/traits.rs @@ -4,11 +4,11 @@ use std::{ process::{ExitStatus, Output}, }; -use blue_build_utils::{constants::COSIGN_PUB_PATH, retry, string_vec}; +use blue_build_utils::{constants::COSIGN_PUB_PATH, retry, semver::Version, string_vec}; use log::{debug, info, trace}; use miette::{bail, Context, IntoDiagnostic, Result}; use oci_distribution::Reference; -use semver::{Version, VersionReq}; +use semver::VersionReq; use crate::drivers::{functions::get_private_key, types::CiDriverType, Driver}; diff --git a/process/drivers/types.rs b/process/drivers/types.rs index bb0df671..85f572de 100644 --- a/process/drivers/types.rs +++ b/process/drivers/types.rs @@ -1,6 +1,9 @@ use std::{collections::HashMap, env}; -use blue_build_utils::constants::{GITHUB_ACTIONS, GITLAB_CI, IMAGE_VERSION_LABEL}; +use blue_build_utils::{ + constants::{GITHUB_ACTIONS, GITLAB_CI, IMAGE_VERSION_LABEL}, + semver::Version, +}; use clap::ValueEnum; use log::trace; use serde::Deserialize; @@ -233,9 +236,9 @@ impl ImageMetadata { pub fn get_version(&self) -> Option { Some( self.labels - .get(IMAGE_VERSION_LABEL)? - .as_str() - .and_then(|v| lenient_semver::parse(v).ok())? + .get(IMAGE_VERSION_LABEL) + .map(ToOwned::to_owned) + .and_then(|v| serde_json::from_value::(v).ok())? .major, ) } diff --git a/utils/Cargo.toml b/utils/Cargo.toml index 3b96c472..4cdca2fe 100644 --- a/utils/Cargo.toml +++ b/utils/Cargo.toml @@ -16,6 +16,7 @@ constcat = "0.6" directories = "6" docker_credential = "1" format_serde_error = "0.3" +lenient_semver = "0.4" process_control = { version = "4", features = ["crossbeam-channel"] } which = "7" @@ -24,6 +25,7 @@ clap = { workspace = true, features = ["derive", "env"] } comlexr.workspace = true log.workspace = true miette.workspace = true +semver.workspace = true serde.workspace = true serde_json.workspace = true serde_yaml.workspace = true diff --git a/utils/src/lib.rs b/utils/src/lib.rs index daff6fcf..94b24f36 100644 --- a/utils/src/lib.rs +++ b/utils/src/lib.rs @@ -2,6 +2,7 @@ pub mod command_output; pub mod constants; pub mod credentials; mod macros; +pub mod semver; pub mod syntax_highlighting; #[cfg(feature = "test")] pub mod test_utils; diff --git a/utils/src/semver.rs b/utils/src/semver.rs new file mode 100644 index 00000000..8699b5c6 --- /dev/null +++ b/utils/src/semver.rs @@ -0,0 +1,31 @@ +use serde::{de::Error, Deserialize}; + +#[derive(Debug)] +pub struct Version(semver::Version); + +impl std::ops::Deref for Version { + type Target = semver::Version; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl std::fmt::Display for Version { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} + +impl<'de> Deserialize<'de> for Version { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let ver = String::deserialize(deserializer)?; + lenient_semver::parse(&ver) + .ok() + .map(Self) + .ok_or_else(|| D::Error::custom(format!("Failed to deserialize version {ver}"))) + } +}