mirror of
https://codeberg.org/icewind/haze.git
synced 2026-06-03 17:14:08 +02:00
record haze version when building images and warn on out of date images
This commit is contained in:
parent
6fdadd9bad
commit
63e17d609f
3 changed files with 60 additions and 2 deletions
|
|
@ -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;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
37
src/image.rs
37
src/image.rs
|
|
@ -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?;
|
||||||
|
|
|
||||||
14
src/php.rs
14
src/php.rs
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue