refactor: update build workflow to use short SHA and add project documentation
KIWI-NG Lint & Build / kiwi-job (push) Successful in 3m1s
KIWI-NG Lint & Build / kiwi-job (push) Successful in 3m1s
This commit is contained in:
@@ -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
|
||||
@@ -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`.
|
||||
Reference in New Issue
Block a user