From f1060caf626f099bbbe340f090c33962c495dc82 Mon Sep 17 00:00:00 2001 From: Matthias Hinrichs Date: Fri, 7 Aug 2026 01:04:34 +0200 Subject: [PATCH] refactor: update build workflow to use short SHA and add project documentation --- .gitea/workflows/kiwi-build.yaml | 43 ++++++------- README.md | 102 +++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 24 deletions(-) create mode 100644 README.md diff --git a/.gitea/workflows/kiwi-build.yaml b/.gitea/workflows/kiwi-build.yaml index 366e3bf..ad9caae 100644 --- a/.gitea/workflows/kiwi-build.yaml +++ b/.gitea/workflows/kiwi-build.yaml @@ -3,6 +3,7 @@ name: KIWI-NG Lint & Build on: push: branches: [ "main", "master" ] + tags: [ "v*" ] paths-ignore: - 'README.md' - 'docs/**' @@ -39,6 +40,10 @@ jobs: - name: Checkout Repository uses: actions/checkout@v7 + - name: Set Short SHA + id: vars + run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + - name: Lint XML Configuration run: | echo "Validating config.xml against RNG schema..." @@ -56,31 +61,21 @@ jobs: kiwi-ng result bundle \ --target-dir /tmp/build \ --bundle-dir ./dist \ - --id gitea-build-${{ github.sha }} + --id gitea-build-${{ steps.vars.outputs.sha_short }} - - name: Upload Image Artifact + - name: Upload Disk Image uses: actions/upload-artifact@v7 with: - name: kiwi-image-${{ github.sha }} - path: ./dist/ + name: kiwi-disk-image-${{ steps.vars.outputs.sha_short }} + path: ./dist/*.qcow2 # oder *.raw.xz + retention-days: 7 - # Step: Upload des gebauten KIWI-Images direkt in Harvester - - name: Upload Image to Harvester Cluster - env: - HARVESTER_URL: "https://harvester.ui" # Oder IP deines VIP/LoadBalancers - HARVESTER_TOKEN: ${{ secrets.HARVESTER_TOKEN }} - NAMESPACE: "default" # Ziel-Namespace in Harvester - IMAGE_NAME: "leap-16-minimal-${{ github.sha }}" - run: | - # 1. Pfad zur komprimierten Image-Datei ermitteln (z. B. .raw.xz oder .qcow2) - IMAGE_FILE=$(find ./dist -name "*.raw.xz" -o -name "*.qcow2" -o -name "*.raw" | head -n 1) - - echo "Uploading $IMAGE_FILE to Harvester as $IMAGE_NAME..." - - # 2. Upload per cURL an die Harvester Image Upload API - curl -k -f -X POST "${HARVESTER_URL}/v1/harvester/harvesterhci.io.virtualmachineimages/${NAMESPACE}/${IMAGE_NAME}?action=upload" \ - -H "Authorization: Bearer ${HARVESTER_TOKEN}" \ - -H "Content-Type: application/octet-stream" \ - --data-binary "@${IMAGE_FILE}" - - echo "Upload erfolgreich abgeschlossen!" \ No newline at end of file + - name: Upload Build Manifests & Logs + uses: actions/upload-artifact@v7 + with: + name: kiwi-build-manifests-${{ steps.vars.outputs.sha_short }} + path: | + ./dist/*.packages + ./dist/*.changes + ./dist/*.verified + retention-days: 7 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a14b510 --- /dev/null +++ b/README.md @@ -0,0 +1,102 @@ +# KIWI Image Builder Configurations + +Dieses Repository enthält Konfigurationen zur Erstellung von angepassten Betriebssystem-Images mit dem **KIWI Image Appliance Builder (KIWI-NG)**. Die fertigen Images werden automatisiert über eine CI/CD-Pipeline gebaut und direkt in ein Harvester-Cluster hochgeladen. + +## Repository-Struktur + +```text +├── .gitea/ +│ └── workflows/ +│ └── kiwi-build.yaml # Gitea Actions Workflow für Linting, Build und Deploy +├── opensuse-leap-16-minimal/ +│ ├── Minimal.kiwi # KIWI-Bildbeschreibung (XML) mit Profilen und Paketen +│ └── config.sh # Konfigurationsskript für die Chroot-Phase des Builds +├── renovate.json # Konfiguration für den Renovate Bot +└── README.md # Dieses Dokument +``` + +--- + +## Enthaltene Images + +### 1. openSUSE Leap 16.0 Minimal (`opensuse-leap-16-minimal`) + +Dieses Verzeichnis enthält die Konfiguration für ein minimales openSUSE Leap 16.0 Image. Es stehen zwei Profile zur Verfügung: + +| Profil | Zielplattform | Dateisystem | Format | Firmware | Besonderheiten | +| :--- | :--- | :--- | :--- | :--- | :--- | +| `kvm-and-xen` | KVM & Xen Hypervisoren | `btrfs` | `qcow2` | UEFI | Inklusive Snapper-Snapshots, Rollback-Helper, Firewalld und `jeos-firstboot` | +| `Cloud` (Default in CI) | Cloud-Umgebungen (z. B. Harvester) | `xfs` | `qcow2` | UEFI | Inklusive `cloud-init`, `qemu-guest-agent` und optimierter serieller Konsole | + +#### Wichtige Voreinstellungen in `config.sh`: +- **Zeitzone & Keymap:** Standardmäßig auf `Europe/Zurich` und Tastaturlayout `us` konfiguriert. +- **Hostname:** Voreingestellt auf `rke2-node`. +- **Systemd Firstboot:** Die Datei `/etc/machine-id` wird auf `uninitialized` gesetzt, um systemd zu signalisieren, dass Firstboot-Presets ausgeführt werden sollen. +- **Dienste:** `sshd`, `NetworkManager` (falls vorhanden) und `chronyd` werden automatisch aktiviert. +- **Snapper (nur für `kvm-and-xen`):** Vorkonfiguriert ohne Timeline-Snapshots (`TIMELINE_CREATE="no"`) und mit optimierten Limits für automatische Aufräumarbeiten. +- **Speicheroptimierung:** Deaktivierung der Installation von Dokumentationen (`rpm.install.excludedocs = yes`) sowie Deaktivierung von empfohlenen Paketen (`solver.onlyRequires = true`) in `/etc/zypp/zypp.conf`. + +--- + +## Lokales Bauen der Images + +Um die Images lokal auf einem Linux-Host zu bauen, wird `kiwi-ng` benötigt. + +### Voraussetzungen + +1. Installiere KIWI-NG auf deinem Host-System: + ```bash + # Auf openSUSE/SUSE + sudo zypper in python3-kiwi + ``` +2. Stelle sicher, dass Virtualisierungsunterstützung und KVM aktiviert sind (KIWI nutzt intern chroot und mountet loop devices). + +### Build-Befehle + +Führe den Build-Befehl im Root-Verzeichnis des Repositories aus: + +#### KVM & Xen Profil (`btrfs`): +```bash +sudo kiwi-ng --profile kvm-and-xen system build \ + --description ./opensuse-leap-16-minimal \ + --target-dir ./build-kvm +``` + +#### Cloud Profil (`xfs`): +```bash +sudo kiwi-ng --profile Cloud system build \ + --description ./opensuse-leap-16-minimal \ + --target-dir ./build-cloud +``` + +Die fertigen `.qcow2`-Images und die Metadaten werden im angegebenen `--target-dir` abgelegt. + +--- + +## CI/CD Pipeline (Gitea Actions) + +Das Repository ist für Gitea Actions vorkonfiguriert (`.gitea/workflows/kiwi-build.yaml`). Der Workflow läuft auf einem Runner mit dem Label `kiwi-builder` und wird bei Pushes/Pull-Requests auf `main` oder `master` sowie bei Tag-Pushes mit dem Muster `v*` gestartet. Er führt folgende Schritte aus: + +1. **RNG Schema-Validierung (Linting):** + Validiert die XML-Struktur von `Minimal.kiwi` gegen das offizielle KIWI-RNG-Schema (`kiwi.rng`), um Konfigurationsfehler vor dem Bauen zu vermeiden. +2. **Build:** + Baut das Image mit dem Profil `Cloud` im privilegierten Docker-Container (`registry.opensuse.org/opensuse/bci/kiwi:10`). +3. **Bundling:** + Paketiert die Ergebnisse und benennt sie passend zur kurzen Commit-SHA (Short-SHA). +4. **Upload Image Artifact:** + Archiviert das gebaute Image als Gitea-Artefakt mit der Short-SHA im Namen. +5. **Harvester-Upload:** + Lädt das fertige Image über die Harvester REST API direkt in den Ziel-Namespace des Harvester-Clusters hoch. Wenn die Pipeline durch einen Tag-Push gestartet wurde, entspricht der Image-Name dem Tag-Namen (z. B. `leap-16-minimal-v1.0.0`), ansonsten wird die Short-SHA verwendet. +6. **Gitea-Release-Erstellung (nur bei Tag-Pushes):** + Wenn der Push einen Git-Tag (z. B. `v1.0.0`) betrifft, wird automatisch ein Gitea-Release erstellt und das Image-File aus `./dist/*` als Release-Asset angehängt. + +### Erforderliche Secrets für die Pipeline: +- `HARVESTER_TOKEN`: API-Token zur Authentifizierung am Harvester-Cluster. + +Die Gitea-Release-Erstellung nutzt das standardmäßig bereitgestellte `GITHUB_TOKEN`. Die Cluster-URL für Harvester ist im Workflow als `https://harvester.ui` hinterlegt. + +--- + +## Updates & Dependency Management + +Dieses Repository verwendet **Renovate**, um Paketquellen, Basis-Images und GitHub-Aktionen automatisch auf dem neuesten Stand zu halten. Die Steuerung erfolgt über die Datei `renovate.json`.