diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..3e74e2e --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,5 @@ +[target.aarch64-unknown-linux-gnu] +linker = "aarch64-linux-gnu-gcc" + +[target.i686-unknown-linux-gnu] +linker = "i686-linux-gnu-gcc" diff --git a/.gitea/workflows/main.yaml b/.gitea/workflows/main.yaml index f7ff79c..42b0760 100644 --- a/.gitea/workflows/main.yaml +++ b/.gitea/workflows/main.yaml @@ -19,6 +19,12 @@ jobs: toolchain: stable cache: false + - name: Install Cross-Compilation Toolchains & Dependencies + run: | + sudo apt-get update + sudo apt-get install -y gcc-aarch64-linux-gnu gcc-i686-linux-gnu + rustup target add x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu i686-unknown-linux-gnu + - name: Install Packaging Tools (Prebuilt Binaries) run: | mkdir -p ~/.cargo/bin @@ -30,21 +36,30 @@ jobs: run: | cargo test - - name: Build Release Binary + - name: Build Release Binaries run: | - cargo build --release + cargo build --release --target x86_64-unknown-linux-gnu + cargo build --release --target aarch64-unknown-linux-gnu + cargo build --release --target i686-unknown-linux-gnu - - name: Build Debian Package (.deb) + - name: Build Debian Packages (.deb) run: | - cargo deb + cargo deb --target x86_64-unknown-linux-gnu --no-build + cargo deb --target aarch64-unknown-linux-gnu --no-build + cargo deb --target i686-unknown-linux-gnu --no-build - - name: Build Fedora / RPM Package (.rpm) + - name: Build Fedora / RPM Packages (.rpm) run: | - cargo generate-rpm + mkdir -p target/generate-rpm + cargo generate-rpm --target x86_64-unknown-linux-gnu -o target/generate-rpm + cargo generate-rpm --target aarch64-unknown-linux-gnu -o target/generate-rpm + cargo generate-rpm --target i686-unknown-linux-gnu -o target/generate-rpm - - name: Build Arch Linux Package (.pkg.tar.zst) + - name: Build Arch Linux Packages (.pkg.tar.zst) run: | - python3 scripts/package-arch.py + python3 scripts/package-arch.py --target x86_64-unknown-linux-gnu + python3 scripts/package-arch.py --target aarch64-unknown-linux-gnu + python3 scripts/package-arch.py --target i686-unknown-linux-gnu - name: Publish Packages to Gitea Package Registry env: diff --git a/.gitea/workflows/testing.yaml b/.gitea/workflows/testing.yaml index 2099e05..8571718 100644 --- a/.gitea/workflows/testing.yaml +++ b/.gitea/workflows/testing.yaml @@ -19,6 +19,12 @@ jobs: toolchain: stable cache: false + - name: Install Cross-Compilation Toolchains & Dependencies + run: | + sudo apt-get update + sudo apt-get install -y gcc-aarch64-linux-gnu gcc-i686-linux-gnu + rustup target add x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu i686-unknown-linux-gnu + - name: Install Packaging Tools (Prebuilt Binaries) run: | mkdir -p ~/.cargo/bin @@ -30,21 +36,30 @@ jobs: run: | cargo test - - name: Build Release Binary + - name: Build Release Binaries run: | - cargo build --release + cargo build --release --target x86_64-unknown-linux-gnu + cargo build --release --target aarch64-unknown-linux-gnu + cargo build --release --target i686-unknown-linux-gnu - - name: Build Debian Package (.deb) + - name: Build Debian Packages (.deb) run: | - cargo deb + cargo deb --target x86_64-unknown-linux-gnu --no-build + cargo deb --target aarch64-unknown-linux-gnu --no-build + cargo deb --target i686-unknown-linux-gnu --no-build - - name: Build Fedora / RPM Package (.rpm) + - name: Build Fedora / RPM Packages (.rpm) run: | - cargo generate-rpm + mkdir -p target/generate-rpm + cargo generate-rpm --target x86_64-unknown-linux-gnu -o target/generate-rpm + cargo generate-rpm --target aarch64-unknown-linux-gnu -o target/generate-rpm + cargo generate-rpm --target i686-unknown-linux-gnu -o target/generate-rpm - - name: Build Arch Linux Package (.pkg.tar.zst) + - name: Build Arch Linux Packages (.pkg.tar.zst) run: | - python3 scripts/package-arch.py + python3 scripts/package-arch.py --target x86_64-unknown-linux-gnu + python3 scripts/package-arch.py --target aarch64-unknown-linux-gnu + python3 scripts/package-arch.py --target i686-unknown-linux-gnu - name: Publish Packages to Gitea Package Registry env: diff --git a/Cargo.lock b/Cargo.lock index c9bf5c4..236e74d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,7 +29,7 @@ checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" [[package]] name = "docker-update" -version = "1.0.0" +version = "1.0.2" dependencies = [ "confy", "libc 1.0.0-alpha.4", diff --git a/Cargo.toml b/Cargo.toml index 494e795..f818ce6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "docker-update" -version = "1.0.0" +version = "1.0.2" edition = "2024" authors = ['DragonSlayer_14'] readme = "README.md" diff --git a/README.md b/README.md index 3bb2b04..7708d12 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ auf neuere Versionen prüft, aktualisiert und neu startet. ## Voraussetzungen -- **Betriebssystem**: Linux (x86_64, aarch64) +- **Betriebssystem**: Linux (amd64 / x86_64, arm64 / aarch64, i386 / i686) - **Laufzeit-Abhängigkeiten**: - `docker` (inkl. Docker Compose Plugin `docker compose` oder Standalone `docker-compose`) - `sudo` @@ -159,7 +159,7 @@ Füge das Repository in `/etc/pacman.conf` ein: ```ini [stable] SigLevel = Optional TrustAll -Server = https://gitea.creative-dragonslayer.de/api/packages/Linuxapps/arch/stable/x86_64 +Server = https://gitea.creative-dragonslayer.de/api/packages/Linuxapps/arch/stable/$arch ``` Installiere das Paket anschließend: @@ -175,7 +175,7 @@ Füge das Testing-Repository in `/etc/pacman.conf` ein: ```ini [testing] SigLevel = Optional TrustAll -Server = https://gitea.creative-dragonslayer.de/api/packages/Linuxapps/arch/testing/x86_64 +Server = https://gitea.creative-dragonslayer.de/api/packages/Linuxapps/arch/testing/$arch ``` Installiere das Paket: @@ -268,16 +268,19 @@ Die Paketkonfiguration und Abhängigkeiten (`sudo`, `docker.io | docker-ce`) sin Die Paketmetadaten und Abhängigkeiten für Arch Linux sind direkt in `Cargo.toml` unter `[package.metadata.arch]` hinterlegt. Das Paket kann nach dem Kompilieren des Release-Builds über das Skript `scripts/package-arch.py` (analog zu -CI/CD) erzeugt -werden: +CI/CD) erzeugt werden (optional mit `--target ` für Cross-Builds): ```bash # Release kompilieren cargo build --release -# Arch Linux-Paket (.pkg.tar.zst) erstellen +# Arch Linux-Paket (.pkg.tar.zst) erstellen (Standard: Host/x86_64) python3 scripts/package-arch.py +# Optional für spezifische Zielarchitektur: +# python3 scripts/package-arch.py --target aarch64-unknown-linux-gnu +# python3 scripts/package-arch.py --target i686-unknown-linux-gnu + # Installation des erstellten Pakets sudo pacman -U target/arch/docker-update-*.pkg.tar.zst ``` @@ -297,6 +300,11 @@ cargo install cargo-generate-rpm cargo build --release cargo generate-rpm +# Optional für spezifische Zielarchitektur (z.B. Cross-Builds): +# mkdir -p target/generate-rpm +# cargo generate-rpm --target aarch64-unknown-linux-gnu -o target/generate-rpm +# cargo generate-rpm --target i686-unknown-linux-gnu -o target/generate-rpm + # Installation des erstellten RPM-Pakets sudo dnf install target/generate-rpm/docker-update-*.rpm ``` diff --git a/scripts/package-arch.py b/scripts/package-arch.py index a1afab4..d6996ad 100755 --- a/scripts/package-arch.py +++ b/scripts/package-arch.py @@ -1,12 +1,28 @@ #!/usr/bin/env python3 +import argparse import json import os import subprocess import tempfile import time +TARGET_ARCH_MAP = { + "x86_64-unknown-linux-gnu": "x86_64", + "x86_64-unknown-linux-musl": "x86_64", + "x86_64": "x86_64", + "amd64": "x86_64", + "aarch64-unknown-linux-gnu": "aarch64", + "aarch64-unknown-linux-musl": "aarch64", + "aarch64": "aarch64", + "arm64": "aarch64", + "i686-unknown-linux-gnu": "i686", + "i686-unknown-linux-musl": "i686", + "i686": "i686", + "i386": "i686", +} -def main(): + +def build_package(target_triple=None, target_arch=None): metadata = json.loads(subprocess.check_output(["cargo", "metadata", "--format-version", "1", "--no-deps"])) pkg = metadata["packages"][0] name = pkg["name"] @@ -19,7 +35,31 @@ def main(): arch_meta = pkg.get("metadata", {}).get("arch", {}) pkgrel = arch_meta.get("pkgrel", "1") - arch = arch_meta.get("arch", "x86_64") + default_arch = arch_meta.get("arch", "x86_64") + + if target_arch: + arch = TARGET_ARCH_MAP.get(target_arch, target_arch) + elif target_triple: + arch = TARGET_ARCH_MAP.get(target_triple, default_arch) + else: + arch = default_arch + + candidate_paths = [] + if target_triple: + candidate_paths.append(f"target/{target_triple}/release/{name}") + candidate_paths.append(f"target/release/{name}") + + bin_path = None + for p in candidate_paths: + if os.path.exists(p): + bin_path = p + break + + if not bin_path: + raise FileNotFoundError( + f"Keine kompilierte Binary für {name} gefunden. Gesuchte Pfade: {candidate_paths}" + ) + depends = arch_meta.get("depends", ["gcc-libs", "glibc", "sudo", "docker-ce-cli", "docker-compose-plugin"]) optdepends = arch_meta.get("optdepends", ["docker-compose: Unterstützung für Docker Compose v1"]) @@ -31,7 +71,7 @@ def main(): os.makedirs(doc_dir, exist_ok=True) os.makedirs(lic_dir, exist_ok=True) - subprocess.run(["install", "-m", "755", f"target/release/{name}", f"{bin_dir}/{name}"], check=True) + subprocess.run(["install", "-m", "755", bin_path, f"{bin_dir}/{name}"], check=True) if os.path.exists("LICENSE"): subprocess.run(["install", "-m", "644", "LICENSE", f"{lic_dir}/LICENSE"], check=True) if os.path.exists("README.md"): @@ -67,5 +107,14 @@ def main(): print(f"Arch-Paket erfolgreich erstellt: {output_file}") +def main(): + parser = argparse.ArgumentParser(description="Erstellt Arch Linux-Pakete (.pkg.tar.zst)") + parser.add_argument("--target", help="Rust Target-Triple (z.B. x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, i686-unknown-linux-gnu)") + parser.add_argument("--arch", help="Architektur (z.B. x86_64, aarch64, i686)") + args = parser.parse_args() + + build_package(target_triple=args.target, target_arch=args.arch) + + if __name__ == "__main__": main()