refactor: update build workflow to use short SHA and add project documentation
KIWI-NG Lint & Build / kiwi-job (push) Successful in 3m1s

This commit is contained in:
2026-08-07 01:04:34 +02:00
parent 26f324a55f
commit f1060caf62
2 changed files with 121 additions and 24 deletions
+19 -24
View File
@@ -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!"
- 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
+102
View File
@@ -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`.