Skip to content

build-gablue-images #39

build-gablue-images

build-gablue-images #39

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