1
0
Fork 0
mirror of https://codeberg.org/icewind/haze.git synced 2026-06-03 09:04:12 +02:00

record haze version when building images and warn on out of date images

This commit is contained in:
Robin Appelman 2026-03-20 15:14:22 +01:00
commit 63e17d609f
3 changed files with 60 additions and 2 deletions

View file

@ -38,6 +38,8 @@
inherit (builtins) toString; inherit (builtins) toString;
inherit (lib) readFile getExe concatStringsSep splitString take; inherit (lib) readFile getExe concatStringsSep splitString take;
version = (fromTOML (readFile ../../Cargo.toml)).package.version;
phpVersion = concatStringsSep "." (take 2 (splitString "." php.version)); phpVersion = concatStringsSep "." (take 2 (splitString "." php.version));
phpEnv = callPackage ./php.nix {inherit debug php;}; phpEnv = callPackage ./php.nix {inherit debug php;};
@ -187,7 +189,14 @@ in
''; '';
config = { config = {
Cmd = [(getExe bootstrap)]; Cmd = [(getExe bootstrap)];
Env = ["EDITOR=hx" "WEBROOT=/var/www/html"]; Env = [
"EDITOR=hx"
"WEBROOT=/var/www/html"
"HAZE_IMAGE_VERSION=${toString version}"
];
WorkingDir = "/var/www/html"; WorkingDir = "/var/www/html";
Labels = {
"nl.icewind.haze.version" = toString version;
};
}; };
} }

View file

@ -5,11 +5,48 @@ use futures_util::StreamExt;
use indicatif::{MultiProgress, ProgressBar, ProgressStyle}; use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
use miette::{IntoDiagnostic, Result, WrapErr}; use miette::{IntoDiagnostic, Result, WrapErr};
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt::{Display, Formatter};
use std::str::FromStr;
#[derive(Debug, Copy, Clone, PartialOrd, PartialEq)]
pub struct ImageVersion {
pub major: u8,
pub minor: u8,
pub patch: u8,
}
impl FromStr for ImageVersion {
type Err = ();
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
let mut parts = s.split('.');
let major = parts.next().ok_or(())?.parse().map_err(|_| ())?;
let minor = parts.next().ok_or(())?.parse().map_err(|_| ())?;
let patch = parts.next().ok_or(())?.parse().map_err(|_| ())?;
Ok(ImageVersion {
major,
minor,
patch,
})
}
}
impl Display for ImageVersion {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}.{}.{}", self.major, self.minor, self.patch)
}
}
pub async fn image_exists(docker: &Docker, image: &str) -> bool { pub async fn image_exists(docker: &Docker, image: &str) -> bool {
docker.inspect_image(image).await.is_ok() docker.inspect_image(image).await.is_ok()
} }
pub async fn image_version(docker: &Docker, image: &str) -> Option<ImageVersion> {
let labels = docker.inspect_image(image).await.ok()?.config?.labels?;
let label = labels.get("nl.icewind.haze.version")?;
ImageVersion::from_str(label).ok()
}
pub async fn update_image(docker: &Docker, image: &str) -> Result<()> { pub async fn update_image(docker: &Docker, image: &str) -> Result<()> {
if image_exists(docker, image).await { if image_exists(docker, image).await {
force_pull_image(docker, image).await?; force_pull_image(docker, image).await?;

View file

@ -1,6 +1,7 @@
use owo_colors::OwoColorize;
use crate::config::ProxyConfig; use crate::config::ProxyConfig;
use crate::database::Database; use crate::database::Database;
use crate::image::pull_image; use crate::image::{image_version, pull_image, ImageVersion};
use crate::network::ensure_network_exists; use crate::network::ensure_network_exists;
use crate::service::Service; use crate::service::Service;
use crate::service::ServiceTrait; use crate::service::ServiceTrait;
@ -123,6 +124,17 @@ impl PhpVersion {
) -> Result<String> { ) -> Result<String> {
ensure_network_exists(docker, "haze").await?; ensure_network_exists(docker, "haze").await?;
pull_image(docker, self.image()).await?; pull_image(docker, self.image()).await?;
let image_version = image_version(&docker, self.image()).await;
let haze_version = ImageVersion::from_str(env!("CARGO_PKG_VERSION"));
if let (Some(image_version), Ok(haze_version)) = (image_version, haze_version) {
if image_version < haze_version {
eprintln!("{}: image version is out of date, run {} to update.", "Warning".red(), "haze update".blue());
eprintln!(" Haze version: {}", haze_version.bright_yellow());
eprintln!(" Image version: {}", image_version.bright_yellow());
}
}
let options = Some(CreateContainerOptions { let options = Some(CreateContainerOptions {
name: Some(id.to_string()), name: Some(id.to_string()),
..CreateContainerOptions::default() ..CreateContainerOptions::default()