build-gablue-images #28
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: build-gablue-images # Nom du workflow affiché dans GitHub Actions | |
on: | |
pull_request: # Événement déclencheur pour les pull requests | |
branches: | |
- main # Branche cible pour les pull requests | |
schedule: # Événement déclencheur pour les builds planifiés | |
- cron: "00 06 * * *" # Construction quotidienne à 06:00 UTC | |
push: # Événement déclencheur pour les push | |
branches: | |
- main # Branche cible pour les push | |
workflow_dispatch: # Permet un déclenchement manuel via l'interface GitHub | |
# Variables d'environnement globales (communes à toutes les images) | |
env: | |
IMAGE_REGISTRY: "ghcr.io/${{ github.repository_owner }}" # Registre où les images seront poussées (GHCR) | |
jobs: | |
build_push: # Nom du job principal | |
name: build-gablue-images # Nom affiché pour le job dans GitHub Actions | |
runs-on: ubuntu-24.04 # Système d'exploitation utilisé pour exécuter le job | |
if: github.event_name != 'push' || contains(github.event.head_commit.message, '[build]') # Condition : exécution si commit contient "[build]" ou autre événement | |
# Stratégie de matrice pour construire les images en parallèle | |
strategy: | |
fail-fast: false # Empêche l'arrêt des autres jobs si un échoue | |
matrix: | |
image: | |
- name: "gablue-main" # Nom de l'image principale | |
desc: "Gablue main image" # Description de l'image principale | |
variant: "main" # Variante de l'image (main) | |
source_image: "kinoite" # Image source de base (kinoite) | |
source_suffix: "-main" # Suffixe de l'image source | |
fedora_version: "41" # Version de Fedora | |
kernel_type: "bazzite" # Type de kernel utilisé | |
kernel_version: "6.13.7-101" # Version spécifique du kernel | |
- name: "gablue-nvidia" # Nom de l'image NVIDIA | |
desc: "Gablue nvidia image" # Description de l'image NVIDIA | |
variant: "nvidia" # Variante de l'image (nvidia) | |
source_image: "kinoite" # Image source de base (kinoite) | |
source_suffix: "-main" # Suffixe de l'image source | |
fedora_version: "41" # Version de Fedora | |
kernel_type: "bazzite" # Type de kernel utilisé | |
kernel_version: "6.13.7-101" # Version spécifique du kernel | |
- name: "gablue-nvidia-open" # Nom de l'image NVIDIA Open | |
desc: "Gablue nvidia-open image" # Description de l'image NVIDIA Open | |
variant: "nvidia-open" # Variante de l'image (nvidia-open) | |
source_image: "kinoite" # Image source de base (kinoite) | |
source_suffix: "-main" # Suffixe de l'image source | |
fedora_version: "41" # Version de Fedora | |
kernel_type: "bazzite" # Type de kernel utilisé | |
kernel_version: "6.13.7-101" # Version spécifique du kernel | |
# Permissions nécessaires pour le job | |
permissions: | |
contents: read # Permission en lecture pour le contenu du dépôt | |
packages: write # Permission en écriture pour publier les images | |
id-token: write # Permission pour gérer les jetons d'identification | |
steps: | |
# Étape 1 : Checkout du dépôt pour accéder aux fichiers | |
- name: Checkout repository # Nom de l'étape | |
uses: actions/checkout@v4 # Action utilisée pour cloner le dépôt | |
# Étape 2 : Optimisation de l'espace de construction | |
- name: Maximize build space # Nom de l'étape | |
uses: ublue-os/remove-unwanted-software@v9 # Action pour libérer de l'espace disque | |
# Étape 3 : Génération des tags pour chaque image | |
- name: Generate tags # Nom de l'étape | |
id: generate-tags # Identifiant pour récupérer les sorties | |
shell: bash # Shell utilisé pour exécuter le script | |
run: | | |
# Création d'un horodatage pour l'historique des versions | |
TIMESTAMP="$(date +%Y%m%d)" # Timestamp au format AAAAMMJJ | |
TIMESTAMPWT="$(date -d '+2 hours' +%Y%m%d-%Hh%M)" # Timestamp avec heure +2h | |
COMMIT_TAGS=() # Tableau pour les tags des commits | |
BUILD_TAGS=() # Tableau pour les tags des builds | |
SHA_SHORT="${GITHUB_SHA::7}" # Hash court du commit (7 premiers caractères) | |
COMMIT_TAGS+=("pr-${{ github.event.number }}") # Tag pour les pull requests | |
COMMIT_TAGS+=("${SHA_SHORT}") # Tag avec le hash court | |
for TAG in "${BUILD_TAGS[@]}"; do # Boucle pour ajouter les timestamps aux tags | |
BUILD_TAGS+=("${TAG}-${TIMESTAMP}") | |
done | |
BUILD_TAGS+=("${TIMESTAMP}") # Ajout du tag avec la date | |
BUILD_TAGS+=("${TIMESTAMPWT}") # Ajout du tag avec date et heure | |
BUILD_TAGS+=("latest") # Ajout du tag "latest" | |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then # Condition pour les pull requests | |
alias_tags=("${COMMIT_TAGS[@]}") # Utilisation des tags de commit pour PR | |
else | |
alias_tags=("${BUILD_TAGS[@]}") # Utilisation des tags de build sinon | |
fi | |
echo "alias_tags=${alias_tags[*]}" >> $GITHUB_OUTPUT # Exportation des tags | |
echo "alias_date=${TIMESTAMPWT}" >> $GITHUB_OUTPUT # Exportation de la date | |
# Étape 4 : Ajout des métadonnées pour l'image | |
- name: Image Metadata # Nom de l'étape | |
uses: docker/metadata-action@v5 # Action pour générer les métadonnées | |
id: meta # Identifiant pour récupérer les sorties | |
with: | |
images: ${{ matrix.image.name }} # Nom de l'image depuis la matrice | |
labels: | | |
io.artifacthub.package.readme-url=https://raw.githubusercontent.com/${{ github.repository }}/main/README.md # URL du README | |
org.opencontainers.image.description=${{ matrix.image.desc }} # Description de l'image | |
org.opencontainers.image.title=${{ matrix.image.name }} # Titre de l'image | |
# Étape 5 : Construction de l'image avec buildah | |
- name: Build Image # Nom de l'étape | |
id: build_image # Identifiant pour récupérer les sorties | |
shell: bash # Shell utilisé pour exécuter le script | |
run: | | |
# Construction de l'image avec les arguments nécessaires | |
sudo buildah build \ | |
--file "Containerfile-gablue" \ | |
--format "docker" \ | |
--build-arg KERNEL_VERSION="${{ matrix.image.kernel_version }}" \ | |
--build-arg VARIANT="${{ matrix.image.variant }}" \ | |
--build-arg SOURCE_IMAGE="${{ matrix.image.source_image }}" \ | |
--build-arg SOURCE_SUFFIX="${{ matrix.image.source_suffix }}" \ | |
--build-arg FEDORA_VERSION="${{ matrix.image.fedora_version }}" \ | |
--build-arg KERNEL_TYPE="${{ matrix.image.kernel_type }}" \ | |
--tag raw-img . | |
# Étape 6 : Rechunk de l'image pour optimisation | |
- name: Rechunk Image # Nom de l'étape | |
id: rechunk # Identifiant pour récupérer les sorties | |
uses: hhd-dev/[email protected] # Action pour rechunker l'image | |
with: | |
ref: "raw-img" # Référence de l'image brute | |
prev-ref: "${{ env.IMAGE_REGISTRY }}/${{ matrix.image.name }}:latest" # Référence précédente | |
skip_compression: true # Désactivation de la compression | |
version: "${{ steps.generate-tags.outputs.alias_date }}" # Version avec timestamp | |
rechunk: "ghcr.io/hhd-dev/rechunk:v1.2.1" # Version de l'outil rechunk | |
# Étape 7 : Chargement et tag de l'image dans podman | |
- name: Load in podman and tag # Nom de l'étape | |
run: | | |
# Chargement de l'image rechunkée | |
IMAGE=$(podman pull ${{ steps.rechunk.outputs.ref }}) # Récupération de l'image | |
sudo rm -rf ${{ steps.rechunk.outputs.output }} # Suppression des fichiers temporaires | |
podman tag $IMAGE ${{ matrix.image.name }}:${{ steps.generate-tags.outputs.alias_tags }} # Tag personnalisé | |
podman tag $IMAGE ${{ matrix.image.name }}:${{ steps.generate-tags.outputs.alias_date }} # Tag avec date | |
podman tag $IMAGE ${{ matrix.image.name }}:latest # Tag "latest" | |
podman tag $IMAGE rechunked-img # Tag pour vérification Secureboot | |
# Étape 8 : Vérification de Secureboot | |
- name: Check Secureboot # Nom de l'étape | |
shell: bash # Shell utilisé pour exécuter le script | |
run: | | |
set -x # Activation du mode debug | |
# Installation des outils si absents | |
if [[ ! $(command -v sbverify) || ! $(command -v curl) || ! $(command -v openssl) ]]; then | |
sudo apt update # Mise à jour des paquets | |
sudo apt install sbsigntool curl openssl # Installation des outils nécessaires | |
fi | |
# Extraction du kernel pour vérification | |
TMP=$(podman create rechunked-img bash) # Création d'un conteneur temporaire | |
podman cp $TMP:/usr/lib/modules/${{ matrix.image.kernel_version }}.${{ matrix.image.kernel_type }}.fc${{ matrix.image.fedora_version }}.x86_64/vmlinuz . # Copie du kernel | |
podman rm $TMP # Suppression du conteneur temporaire | |
sbverify --list vmlinuz # Liste des signatures | |
curl --retry 3 -Lo kernel-sign.der https://github.com/ublue-os/kernel-cache/raw/main/certs/public_key.der # Téléchargement du certificat kernel | |
curl --retry 3 -Lo akmods.der https://github.com/ublue-os/kernel-cache/raw/main/certs/public_key_2.der # Téléchargement du certificat akmods | |
openssl x509 -in kernel-sign.der -out kernel-sign.crt # Conversion du certificat kernel | |
openssl x509 -in akmods.der -out akmods.crt # Conversion du certificat akmods | |
sbverify --cert kernel-sign.crt vmlinuz || exit 1 # Vérification avec le certificat kernel | |
sbverify --cert akmods.crt vmlinuz || exit 1 # Vérification avec le certificat akmods | |
# Étape 9 : Conversion du registre en minuscules | |
- name: Lowercase Registry # Nom de l'étape | |
id: registry_case # Identifiant pour récupérer les sorties | |
uses: ASzc/change-string-case-action@v6 # Action pour convertir en minuscules | |
with: | |
string: ${{ env.IMAGE_REGISTRY }} # Chaîne à convertir (registre) | |
# Étape 10 : Connexion au registre GitHub Container Registry | |
- name: Login to GitHub Container Registry # Nom de l'étape | |
uses: docker/login-action@v3 # Action pour se connecter à GHCR | |
with: | |
registry: ghcr.io # Registre cible | |
username: ${{ github.actor }} # Nom d'utilisateur GitHub | |
password: ${{ secrets.GITHUB_TOKEN }} # Token d'authentification | |
# Étape 11 : Pousser l'image vers GHCR | |
- name: Push To GHCR # Nom de l'étape | |
uses: Wandalen/[email protected] # Action pour retenter en cas d'échec | |
id: push # Identifiant pour récupérer les sorties | |
env: | |
REGISTRY_USER: ${{ github.actor }} # Utilisateur pour le push | |
REGISTRY_PASSWORD: ${{ github.token }} # Mot de passe/token | |
with: | |
action: redhat-actions/push-to-registry@v2 # Action pour pousser l'image | |
attempt_limit: 3 # Nombre maximum de tentatives | |
attempt_delay: 15000 # Délai entre tentatives (15 secondes) | |
with: | | |
image: ${{ matrix.image.name }} # Nom de l'image à pousser | |
tags: ${{ steps.generate-tags.outputs.alias_tags }} # Tags à appliquer | |
registry: ${{ steps.registry_case.outputs.lowercase }} # Registre en minuscules | |
username: ${{ env.REGISTRY_USER }} # Nom d'utilisateur | |
password: ${{ env.REGISTRY_PASSWORD }} # Mot de passe | |
# Étape 12 : Installation de Cosign pour signature (optionnel) | |
- uses: sigstore/[email protected] # Action pour installer Cosign | |
if: github.event_name != 'pull_request' # Condition : hors pull requests | |
# Étape 13 : Signature de l'image | |
- name: Sign container image # Nom de l'étape | |
if: github.event_name != 'pull_request' # Condition : hors pull requests | |
run: | | |
# Signature de l'image avec Cosign | |
cosign sign -y --key env://COSIGN_PRIVATE_KEY ${{ steps.registry_case.outputs.lowercase }}/${{ matrix.image.name }}@${TAGS} | |
env: | |
TAGS: ${{ steps.push.outputs.outputs && fromJSON(steps.push.outputs.outputs).digest }} # Digest de l'image poussée | |
COSIGN_EXPERIMENTAL: false # Désactivation du mode expérimental | |
COSIGN_PRIVATE_KEY: ${{ secrets.SIGNING_SECRET }} # Clé privée pour la signature |