Compare commits

...
17 Commits
Author SHA1 Message Date
DragonSlayer_14 819772d00d Merge pull request 'Merge dev in testing: Anpassung Fallback auf dokcer-compose und Fehlerbehanldung bei sudo-Ausführung verbessert' (#8) from dev into testing
Testing Build, Publish & Preview Release / Build, Publish Packages (Testing) & Create Preview Release (push) Successful in 56s
Reviewed-on: #8
2026-08-23 16:14:18 +00:00
DragonSlayer_14 d873619a6f Fix: Fallback auf docker-compose bei Nichtverfügbarkeit in updater.rs 2026-08-23 18:13:32 +02:00
DragonSlayer_14 62e50748da Fix: Fehlerbehandlung bei sudo-Ausführung verbessert 2026-08-23 18:12:54 +02:00
DragonSlayer_14 66279df701 Merge pull request 'Aktualisiere Authentifizierungsmethode: Verwendung von Authorization-Header statt --user und Entfernen von ACTOR-Variable' (#7) from dev into testing
Testing Build, Publish & Preview Release / Build, Publish Packages (Testing) & Create Preview Release (push) Failing after 53s
Reviewed-on: #7
2026-08-23 15:56:32 +00:00
DragonSlayer_14 a88d7d7723 Aktualisiere Authentifizierungsmethode: Verwendung von Authorization-Header statt --user und Entfernen von ACTOR-Variable 2026-08-23 17:56:09 +02:00
DragonSlayer_14 5923b9f6a4 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
2026-08-23 15:49:57 +00:00
DragonSlayer_14 2e852a2a48 Refactor: 127-Status-Prüfung entfernen und Bedingung vereinfachen 2026-08-23 17:49:02 +02:00
DragonSlayer_14 c2da58c74e Refactor: Entferne Terminal-Überprüfung und vereinfache Ausgabehandling 2026-08-23 17:48:50 +02:00
DragonSlayer_14 d042137d36 Fix: Branch-Name von dev zu testing aktualisiert und dev.yml in testing.yaml umbenannt 2026-08-23 17:44:41 +02:00
DragonSlayer_14 b7a2e60790 Fix: Workflow-Konfiguration für Testing-Branch aktualisiert und dev.yml in testing.yaml umbenannt 2026-08-23 17:41:22 +02:00
DragonSlayer_14 0aa20c7362 Merge pull request 'Merge dev in testing: Anpassung der Actions' (#5) from dev into testing
Dev Build, Publish & Preview Release / Build, Publish Packages (Testing) & Create Preview Release (push) Failing after 53s
Reviewed-on: #5
2026-08-23 15:33:22 +00:00
DragonSlayer_14 ad6de96d14 Merge pull request 'Feature/gitea actions' (#4) from feature/gitea-actions into dev
Reviewed-on: #4
2026-08-23 15:32:43 +00:00
DragonSlayer_14 e3e12afa0d Aktualisiere Authentifizierungsmethode und erweitere TOKEN-Definition in CI/CD-Workflows 2026-08-23 17:32:09 +02:00
DragonSlayer_14 8595977d90 Fix: Packaging-Tools-Installation über Prebuilt-Binaries in CI/CD-Workflows
Ersetzt `cargo install` durch direkte Binärdateien von cargo-binstall in beiden Workflows.
2026-08-23 17:11:01 +02:00
DragonSlayer_14 abdd2f5df8 Merge pull request 'Fix: Branch-Name-Anpassung und Tool-Version-Update in CI/CD-Workflows' (#3) from dev into testing
Dev Build, Publish & Preview Release / Build, Publish Packages (Testing) & Create Preview Release (push) Failing after 5m27s
Reviewed-on: #3
2026-08-23 14:58:10 +00:00
DragonSlayer_14 52377f71f8 Merge pull request 'Fix: Branch-Name-Anpassung und Tool-Version-Update in CI/CD-Workflows' (#2) from feature/gitea-actions into dev
Reviewed-on: #2
2026-08-23 14:56:58 +00:00
DragonSlayer_14 f99e621d3b Merge pull request 'Merge Feature/gitea-actions in dev' (#1) from feature/gitea-actions into dev
Dev Build, Publish & Preview Release / Build, Publish Packages (Testing) & Create Preview Release (push) Canceled after 9m3s
Reviewed-on: #1
2026-08-23 14:35:57 +00:00
8 changed files with 73 additions and 58 deletions
@@ -19,9 +19,12 @@ jobs:
toolchain: stable
cache: false
- name: Install Packaging Tools
- name: Install Packaging Tools (Prebuilt Binaries)
run: |
cargo install cargo-deb cargo-generate-rpm --locked
mkdir -p ~/.cargo/bin
curl -fsSL https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz | tar -xz -C ~/.cargo/bin
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
~/.cargo/bin/cargo-binstall -y --no-symlinks cargo-deb cargo-generate-rpm
- name: Run Tests
run: |
@@ -48,7 +51,7 @@ jobs:
env:
GITEA_URL: ${{ gitea.server_url || github.server_url }}
REPO_OWNER: ${{ gitea.repository_owner || github.repository_owner }}
TOKEN: ${{ secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
run: |
echo "Veröffentliche Debian-Paket (Distribution: stable, Component: main)..."
for deb in target/debian/*.deb; do
@@ -81,7 +84,7 @@ jobs:
env:
GITEA_URL: ${{ gitea.server_url || github.server_url }}
REPO: ${{ gitea.repository || github.repository }}
TOKEN: ${{ secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
run: |
VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)"
TAG_NAME="v${VERSION}"
@@ -1,4 +1,4 @@
name: Dev Build, Publish & Preview Release
name: Testing Build, Publish & Preview Release
on:
push:
@@ -19,9 +19,12 @@ jobs:
toolchain: stable
cache: false
- name: Install Packaging Tools
- name: Install Packaging Tools (Prebuilt Binaries)
run: |
cargo install cargo-deb cargo-generate-rpm --locked
mkdir -p ~/.cargo/bin
curl -fsSL https://github.com/cargo-bins/cargo-binstall/releases/latest/download/cargo-binstall-x86_64-unknown-linux-musl.tgz | tar -xz -C ~/.cargo/bin
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
~/.cargo/bin/cargo-binstall -y --no-symlinks cargo-deb cargo-generate-rpm
- name: Run Tests
run: |
@@ -48,7 +51,7 @@ jobs:
env:
GITEA_URL: ${{ gitea.server_url || github.server_url }}
REPO_OWNER: ${{ gitea.repository_owner || github.repository_owner }}
TOKEN: ${{ secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
run: |
echo "Veröffentliche Debian-Paket (Distribution: testing, Component: main)..."
for deb in target/debian/*.deb; do
@@ -81,12 +84,12 @@ jobs:
env:
GITEA_URL: ${{ gitea.server_url || github.server_url }}
REPO: ${{ gitea.repository || github.repository }}
TOKEN: ${{ secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
run: |
VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)"
TAG_NAME="v${VERSION}-preview"
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}..."
@@ -105,7 +108,7 @@ jobs:
CREATE_PAYLOAD=$(cat <<EOF
{
"tag_name": "${TAG_NAME}",
"target_commitish": "dev",
"target_commitish": "testing",
"name": "${RELEASE_TITLE}",
"body": "${RELEASE_NOTES}",
"draft": false,
+2 -2
View File
@@ -12,10 +12,10 @@
<option name="patterns">
<list>
<Item>
<option name="path" value=".gitea/workflows/dev.yml" />
<option name="path" value=".gitea/workflows/testing.yaml" />
</Item>
<Item>
<option name="path" value=".gitea/workflows/main.yml" />
<option name="path" value=".gitea/workflows/main.yaml" />
</Item>
</list>
</option>
+5 -4
View File
@@ -29,8 +29,8 @@ lädt diese herunter, startet betroffene Services neu und bereinigt ungenutzte Z
DockerUpdate/
├── .gitea/
│ └── workflows/
│ ├── dev.yml # CI/CD für dev-Branch (Tests, Testing-Packages & Preview-Release)
│ └── main.yml # CI/CD für main-Branch (Tests, Stable-Packages & Release)
│ ├── testing.yaml # CI/CD für testing-Branch (Tests, Testing-Packages & Preview-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.lock
├── LICENSE # GPL-3.0 Lizenztext
@@ -76,10 +76,11 @@ DockerUpdate/
- `is_run_as_root()`: Nutzt `libc::geteuid() == 0`.
- `run_as_root()`: Führt `sudo <args>` per `exec` aus.
- **`.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
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
Paketen als Assets.
- **`packaging/`**:
+4 -4
View File
@@ -40,7 +40,7 @@ auf neuere Versionen prüft, aktualisiert und neu startet.
## 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
bereitgestellt.
@@ -61,7 +61,7 @@ sudo apt update
sudo apt install docker-update
```
#### Testing (Vorschau / Dev)
#### Testing (Vorschau / Testing)
```bash
# Keyring installieren
@@ -95,7 +95,7 @@ EOF
sudo dnf install docker-update
```
#### Testing (Vorschau / Dev)
#### Testing (Vorschau / Testing)
```bash
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
```
#### Testing (Vorschau / Dev)
#### Testing (Vorschau / Testing)
Füge das Testing-Repository in `/etc/pacman.conf` ein:
+13 -31
View File
@@ -1,10 +1,10 @@
//! Einfaches, threadsicheres Logging-Modul.
//!
//! 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]).
//! - 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:
//! - Bei einem leeren `tag` wird ein leerer Tag-Abschnitt erzeugt.
@@ -22,13 +22,13 @@
use std::env;
use std::fmt::{Display, Formatter};
use std::fs::{create_dir_all, File, OpenOptions};
use std::io::{stdout, IsTerminal, Write};
use std::fs::{File, OpenOptions, create_dir_all};
use std::io::Write;
use std::sync::{Mutex, OnceLock};
use crate::config;
use crate::program;
use time::{macros::format_description, OffsetDateTime};
use time::{OffsetDateTime, macros::format_description};
/// Schweregrade für Logeinträge in aufsteigender Detailtiefe.
///
@@ -71,14 +71,11 @@ impl TryFrom<String> for LogLevel {
"warn" => Ok(LogLevel::Warn),
"info" => Ok(LogLevel::Info),
"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.
static LOG_LEVEL: OnceLock<LogLevel> = OnceLock::new();
@@ -89,7 +86,7 @@ static LOG_FILE: OnceLock<Mutex<Option<File>>> = OnceLock::new();
///
/// Verhalten:
/// - 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).
///
/// Parameter:
@@ -109,12 +106,10 @@ pub fn log(tag: &str, message: &str, log_level: LogLevel) {
if log_level <= get_log_level() {
let message: String = format_message(tag, message, &log_level);
if is_terminal() {
if log_level == LogLevel::Error {
eprintln!("{}", message)
} else {
println!("{}", message)
}
if log_level == LogLevel::Error {
eprintln!("{}", message);
} else {
println!("{}", message);
}
let file_lock = get_or_init_log_file();
@@ -138,17 +133,7 @@ fn get_log_level() -> LogLevel {
*LOG_LEVEL.get_or_init(|| {
let log_level = &config::get_config().general.log_level;
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.
@@ -234,10 +219,7 @@ fn open_log_file() -> std::io::Result<File> {
let file_name = format!("log-{}.log", date_str);
dir.push(file_name);
OpenOptions::new()
.create(true)
.append(true)
.open(dir)
OpenOptions::new().create(true).append(true).open(dir)
}
#[cfg(test)]
+10 -2
View File
@@ -1,6 +1,7 @@
use crate::log::{LogLevel, log};
use std::env;
use std::os::unix::process::CommandExt;
use std::process::Command;
use std::process::{Command, exit};
/// Prüft, ob das Programm mit Root-/Administrator-Rechten ausgeführt wird.
///
@@ -11,10 +12,17 @@ use std::process::Command;
pub fn is_run_as_root() -> bool {
unsafe { libc::geteuid() == 0 }
}
/// Startet das Programm mit Root-Rechten über `sudo` neu.
///
/// Diese Funktion versucht das Programm mit erhöhten Rechten neu zu starten.
pub fn run_as_root() {
let commandline_args: Vec<String> = env::args().collect();
let _output = Command::new("sudo").args(&commandline_args).exec(); // Bye bye never returns
let err = Command::new("sudo").args(&commandline_args).exec();
log(
"auth",
&format!("Fehler beim Ausführen von 'sudo': {}", err),
LogLevel::Error,
);
exit(1);
}
+22 -4
View File
@@ -93,7 +93,7 @@ fn run_docker_command(args: &[&str]) -> std::io::Result<Output> {
}
/// Führt einen Docker-Compose-Befehl im angegebenen Verzeichnis aus.
/// Versucht zuerst `docker compose` und fällt bei Bedarf auf `docker-compose` zurück.
/// Versucht zuerst `docker compose` und fällt bei Nichtverfügbarkeit auf `docker-compose` zurück.
pub fn run_compose_command(dir: &Path, args: &[&str]) -> std::io::Result<Output> {
let mut compose_args = vec!["compose"];
compose_args.extend_from_slice(args);
@@ -104,14 +104,32 @@ pub fn run_compose_command(dir: &Path, args: &[&str]) -> std::io::Result<Output>
.output();
match output {
Ok(out) if out.status.success() || out.status.code() != Some(127) => Ok(out),
_ => {
// Fallback auf docker-compose (v1)
Ok(out) => {
let stderr = String::from_utf8_lossy(&out.stderr);
let is_unavailable = !out.status.success()
&& (stderr.contains("is not a docker command")
|| stderr.contains("unknown command \"compose\"")
|| stderr.contains("unknown command: compose"));
if is_unavailable {
if let Ok(fallback_out) = Command::new("docker-compose")
.current_dir(dir)
.args(args)
.output()
{
return Ok(fallback_out);
}
}
Ok(out)
}
Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
// docker-Binary nicht gefunden, versuche docker-compose
Command::new("docker-compose")
.current_dir(dir)
.args(args)
.output()
}
Err(err) => Err(err),
}
}