Merge pull request 'Merge dev in testing: Action-Anpassung von dev auf testing Branch' (#6) from dev into testing
Testing Build, Publish & Preview Release / Build, Publish Packages (Testing) & Create Preview Release (push) Failing after 56s

Reviewed-on: #6
This commit was merged in pull request #6.
This commit is contained in:
2026-08-23 15:49:57 +00:00
7 changed files with 28 additions and 45 deletions
@@ -1,4 +1,4 @@
name: Dev Build, Publish & Preview Release name: Testing Build, Publish & Preview Release
on: on:
push: push:
@@ -90,7 +90,7 @@ jobs:
VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)" VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)"
TAG_NAME="v${VERSION}-preview" TAG_NAME="v${VERSION}-preview"
RELEASE_TITLE="Preview Release ${TAG_NAME}" RELEASE_TITLE="Preview Release ${TAG_NAME}"
RELEASE_NOTES="Automatisches Preview-Release für docker-update ${VERSION} (Branch: dev)." RELEASE_NOTES="Automatisches Preview-Release für docker-update ${VERSION} (Branch: Testing)."
echo "Erstelle oder hole Preview-Release für Tag ${TAG_NAME} in ${REPO}..." echo "Erstelle oder hole Preview-Release für Tag ${TAG_NAME} in ${REPO}..."
@@ -109,7 +109,7 @@ jobs:
CREATE_PAYLOAD=$(cat <<EOF CREATE_PAYLOAD=$(cat <<EOF
{ {
"tag_name": "${TAG_NAME}", "tag_name": "${TAG_NAME}",
"target_commitish": "dev", "target_commitish": "testing",
"name": "${RELEASE_TITLE}", "name": "${RELEASE_TITLE}",
"body": "${RELEASE_NOTES}", "body": "${RELEASE_NOTES}",
"draft": false, "draft": false,
+2 -2
View File
@@ -12,10 +12,10 @@
<option name="patterns"> <option name="patterns">
<list> <list>
<Item> <Item>
<option name="path" value=".gitea/workflows/dev.yml" /> <option name="path" value=".gitea/workflows/testing.yaml" />
</Item> </Item>
<Item> <Item>
<option name="path" value=".gitea/workflows/main.yml" /> <option name="path" value=".gitea/workflows/main.yaml" />
</Item> </Item>
</list> </list>
</option> </option>
+5 -4
View File
@@ -29,8 +29,8 @@ lädt diese herunter, startet betroffene Services neu und bereinigt ungenutzte Z
DockerUpdate/ DockerUpdate/
├── .gitea/ ├── .gitea/
│ └── workflows/ │ └── workflows/
│ ├── dev.yml # CI/CD für dev-Branch (Tests, Testing-Packages & Preview-Release) │ ├── testing.yaml # CI/CD für testing-Branch (Tests, Testing-Packages & Preview-Release)
│ └── main.yml # CI/CD für main-Branch (Tests, Stable-Packages & Release) │ └── main.yaml # CI/CD für main-Branch (Tests, Stable-Packages & Release)
├── Cargo.toml # Rust-Manifest, Abhängigkeiten und Metadaten für cargo-deb / generate-rpm ├── Cargo.toml # Rust-Manifest, Abhängigkeiten und Metadaten für cargo-deb / generate-rpm
├── Cargo.lock ├── Cargo.lock
├── LICENSE # GPL-3.0 Lizenztext ├── LICENSE # GPL-3.0 Lizenztext
@@ -76,10 +76,11 @@ DockerUpdate/
- `is_run_as_root()`: Nutzt `libc::geteuid() == 0`. - `is_run_as_root()`: Nutzt `libc::geteuid() == 0`.
- `run_as_root()`: Führt `sudo <args>` per `exec` aus. - `run_as_root()`: Führt `sudo <args>` per `exec` aus.
- **`.gitea/workflows/`**: - **`.gitea/workflows/`**:
- `dev.yml`: Führt bei Push auf `dev` Tests und Builds durch, veröffentlicht Pakete in der Gitea Package Registry - `testing.yaml`: Führt bei Push auf `testing` Tests und Builds durch, veröffentlicht Pakete in der Gitea Package
Registry
(`distribution: testing`, `component: main` bzw. Gruppe/Repo `testing`) und erstellt ein Gitea Preview-Release mit (`distribution: testing`, `component: main` bzw. Gruppe/Repo `testing`) und erstellt ein Gitea Preview-Release mit
den Paketen als Assets. den Paketen als Assets.
- `main.yml`: Führt bei Push auf `main` Tests und Builds durch, veröffentlicht Pakete in der Gitea Package Registry - `main.yaml`: Führt bei Push auf `main` Tests und Builds durch, veröffentlicht Pakete in der Gitea Package Registry
(`distribution: stable`, `component: main` bzw. Gruppe/Repo `stable`) und erstellt ein Gitea Release mit den (`distribution: stable`, `component: main` bzw. Gruppe/Repo `stable`) und erstellt ein Gitea Release mit den
Paketen als Assets. Paketen als Assets.
- **`packaging/`**: - **`packaging/`**:
+4 -4
View File
@@ -40,7 +40,7 @@ auf neuere Versionen prüft, aktualisiert und neu startet.
## Installation aus der Gitea-Paket-Registry ## Installation aus der Gitea-Paket-Registry
Über die CI/CD-Pipelines werden bei jedem Push auf den `main`-Branch (Release / Stable) und `dev`-Branch (Preview / Über die CI/CD-Pipelines werden bei jedem Push auf den `main`-Branch (Release / Stable) und `testing`-Branch (Preview /
Testing) automatisch Pakete für **Debian/Ubuntu**, **Fedora/RHEL** und **Arch Linux** in der Gitea-Paket-Registry Testing) automatisch Pakete für **Debian/Ubuntu**, **Fedora/RHEL** und **Arch Linux** in der Gitea-Paket-Registry
bereitgestellt. bereitgestellt.
@@ -61,7 +61,7 @@ sudo apt update
sudo apt install docker-update sudo apt install docker-update
``` ```
#### Testing (Vorschau / Dev) #### Testing (Vorschau / Testing)
```bash ```bash
# Keyring installieren # Keyring installieren
@@ -95,7 +95,7 @@ EOF
sudo dnf install docker-update sudo dnf install docker-update
``` ```
#### Testing (Vorschau / Dev) #### Testing (Vorschau / Testing)
```bash ```bash
sudo tee /etc/yum.repos.d/docker-update-testing.repo << 'EOF' sudo tee /etc/yum.repos.d/docker-update-testing.repo << 'EOF'
@@ -130,7 +130,7 @@ Installiere das Paket anschließend:
sudo pacman -Sy docker-update sudo pacman -Sy docker-update
``` ```
#### Testing (Vorschau / Dev) #### Testing (Vorschau / Testing)
Füge das Testing-Repository in `/etc/pacman.conf` ein: Füge das Testing-Repository in `/etc/pacman.conf` ein:
+13 -31
View File
@@ -1,10 +1,10 @@
//! Einfaches, threadsicheres Logging-Modul. //! Einfaches, threadsicheres Logging-Modul.
//! //!
//! Merkmale: //! Merkmale:
//! - Ausgabe in Terminal (stdout/stderr) und zusätzlich in eine Logdatei im temporären Verzeichnis. //! - Ausgabe auf Standard-Streams (stdout/stderr) und zusätzlich in eine Logdatei im temporären Verzeichnis.
//! - Nachrichtenvorlage: `[DD.MM.YYYY HH:MM:SS.mmm][LEVEL][TAG]: <Text>` mit Präfix ([!]/[?]/[i]/[d]). //! - Nachrichtenvorlage: `[DD.MM.YYYY HH:MM:SS.mmm][LEVEL][TAG]: <Text>` mit Präfix ([!]/[?]/[i]/[d]).
//! - Der aktuell verwendete Schweregradfilter ist statisch (`LOG_LEVEL`) und wird zur Laufzeit nicht geändert. //! - Der aktuell verwendete Schweregradfilter ist statisch (`LOG_LEVEL`) und wird zur Laufzeit nicht geändert.
//! - Terminal-Erkennung und Dateihandle werden lazily initialisiert und zwischengespeichert (`OnceLock`). //! - Dateihandle wird lazily initialisiert und zwischengespeichert (`OnceLock`).
//! //!
//! Hinweise: //! Hinweise:
//! - Bei einem leeren `tag` wird ein leerer Tag-Abschnitt erzeugt. //! - Bei einem leeren `tag` wird ein leerer Tag-Abschnitt erzeugt.
@@ -22,13 +22,13 @@
use std::env; use std::env;
use std::fmt::{Display, Formatter}; use std::fmt::{Display, Formatter};
use std::fs::{create_dir_all, File, OpenOptions}; use std::fs::{File, OpenOptions, create_dir_all};
use std::io::{stdout, IsTerminal, Write}; use std::io::Write;
use std::sync::{Mutex, OnceLock}; use std::sync::{Mutex, OnceLock};
use crate::config; use crate::config;
use crate::program; use crate::program;
use time::{macros::format_description, OffsetDateTime}; use time::{OffsetDateTime, macros::format_description};
/// Schweregrade für Logeinträge in aufsteigender Detailtiefe. /// Schweregrade für Logeinträge in aufsteigender Detailtiefe.
/// ///
@@ -71,14 +71,11 @@ impl TryFrom<String> for LogLevel {
"warn" => Ok(LogLevel::Warn), "warn" => Ok(LogLevel::Warn),
"info" => Ok(LogLevel::Info), "info" => Ok(LogLevel::Info),
"debug" => Ok(LogLevel::Debug), "debug" => Ok(LogLevel::Debug),
_ => Err(LogLevel::Info) _ => Err(LogLevel::Info),
} }
} }
} }
/// Zwischenspeicher für die einmalig ermittelte Terminal-Fähigkeit von `stdout`.
static IS_TERMINAL: OnceLock<bool> = OnceLock::new();
/// Globaler Schweregradfilter für Ausgabe. /// Globaler Schweregradfilter für Ausgabe.
static LOG_LEVEL: OnceLock<LogLevel> = OnceLock::new(); static LOG_LEVEL: OnceLock<LogLevel> = OnceLock::new();
@@ -89,7 +86,7 @@ static LOG_FILE: OnceLock<Mutex<Option<File>>> = OnceLock::new();
/// ///
/// Verhalten: /// Verhalten:
/// - Wenn `log_level` größer als der globale Filter ist, wird nichts ausgegeben. /// - Wenn `log_level` größer als der globale Filter ist, wird nichts ausgegeben.
/// - Bei Terminalausgabe gehen `Error`-Meldungen nach `stderr`, alle anderen nach `stdout`. /// - `Error`-Meldungen gehen nach `stderr`, alle anderen nach `stdout`.
/// - Zusätzlich wird in eine tägliche Logdatei im Temp-Verzeichnis geschrieben (wenn erfolgreich geöffnet). /// - Zusätzlich wird in eine tägliche Logdatei im Temp-Verzeichnis geschrieben (wenn erfolgreich geöffnet).
/// ///
/// Parameter: /// Parameter:
@@ -109,12 +106,10 @@ pub fn log(tag: &str, message: &str, log_level: LogLevel) {
if log_level <= get_log_level() { if log_level <= get_log_level() {
let message: String = format_message(tag, message, &log_level); let message: String = format_message(tag, message, &log_level);
if is_terminal() { if log_level == LogLevel::Error {
if log_level == LogLevel::Error { eprintln!("{}", message);
eprintln!("{}", message) } else {
} else { println!("{}", message);
println!("{}", message)
}
} }
let file_lock = get_or_init_log_file(); let file_lock = get_or_init_log_file();
@@ -138,17 +133,7 @@ fn get_log_level() -> LogLevel {
*LOG_LEVEL.get_or_init(|| { *LOG_LEVEL.get_or_init(|| {
let log_level = &config::get_config().general.log_level; let log_level = &config::get_config().general.log_level;
LogLevel::try_from(log_level.to_string()).unwrap_or(LogLevel::Info) LogLevel::try_from(log_level.to_string()).unwrap_or(LogLevel::Info)
} })
)
}
/// Ermittelt einmalig, ob `stdout` ein Terminal ist, und cached das Ergebnis.
///
/// Rückgabe:
/// - `true`, wenn `stdout` ein TTY/Terminal ist.
/// - `false` andernfalls.
fn is_terminal() -> bool {
*IS_TERMINAL.get_or_init(|| stdout().is_terminal())
} }
/// Formatiert eine Lognachricht mit Zeitstempel, Level, Tag und Präfix. /// Formatiert eine Lognachricht mit Zeitstempel, Level, Tag und Präfix.
@@ -234,10 +219,7 @@ fn open_log_file() -> std::io::Result<File> {
let file_name = format!("log-{}.log", date_str); let file_name = format!("log-{}.log", date_str);
dir.push(file_name); dir.push(file_name);
OpenOptions::new() OpenOptions::new().create(true).append(true).open(dir)
.create(true)
.append(true)
.open(dir)
} }
#[cfg(test)] #[cfg(test)]
+1 -1
View File
@@ -104,7 +104,7 @@ pub fn run_compose_command(dir: &Path, args: &[&str]) -> std::io::Result<Output>
.output(); .output();
match output { match output {
Ok(out) if out.status.success() || out.status.code() != Some(127) => Ok(out), Ok(out) if out.status.success() => Ok(out),
_ => { _ => {
// Fallback auf docker-compose (v1) // Fallback auf docker-compose (v1)
Command::new("docker-compose") Command::new("docker-compose")