Files
factory/ansible/arcodange/factory
CI BotandClaude Opus 5 fdecabf8ca feat(ci): construire l'image des jobs CI lourds sur chaque machine à runner
Les jobs CI du dépôt kadans réinstallent, à CHAQUE exécution, des choses qui
changent tous les trimestres. Mesuré le 2026-07-29 sur le run 628 (runner
ARM64, 2 vCPU / 3 Gio) :

  npm install -g bun                        →    8,6 s
  playwright install --with-deps chromium   →  104,0 s   (apt-get, à chaque run)
                                               ────────
                                                112,6 s jetées par run, sur le
                                                job qui EST le chemin critique

Le cache `actions/cache` ne peut rien contre ces 104 s : il couvre le NAVIGATEUR
(299 Mo déjà mis en cache), pas ses dépendances SYSTÈME — `--with-deps` relance
apt quoi qu'il arrive.

POURQUOI CONSTRUIRE ICI PLUTÔT QUE POUSSER UNE IMAGE. La tentative de publier
l'image au registre a échoué (kadans#224 puis #225) : 3,81 Go dont une couche
unique de 1,36 Go, `docker push` casse en « connection reset by peer » — 7
couches passent, 3 sont retentées 50 fois puis abandonnées. À titre de
comparaison, runner-images:ubuntu-latest-ca (534,7 Mo, plus grosse couche
261 Mo) passe sans problème : la limite est entre 261 Mo et ~500 Mo par couche.
Construire localement supprime le problème — aucune couche ne traverse le
réseau.

Et c'est bien sur CHAQUE machine : avec `capacity: 1`, le parallélisme vient de
plusieurs Raspberry, et `container:` est résolu par le runner. Un job qui
atterrit là où l'image manque échoue AVANT sa première étape.

Trois choix de conception :

1. L'image hérite de runner-images:ubuntu-latest-ca, donc du certificat de la CA
   interne (step-ca). Repartir de node:20-bookworm obligerait à réinjecter le CA
   à la main, et tout job parlant à gitea.arcodange.lab échouerait en TLS.

2. TROIS `RUN` séparés (bun / dépendances système / navigateur), délibérément.
   La version qui a échoué faisait une couche de 1,36 Go. Ne pas les fusionner
   pour « gagner une couche ».

3. L'image est ÉPINGLÉE par un conteneur factice — ce qui implémente enfin la
   section 1 de docs/adr/20260407-docker-storage-gitea-runner.md, restée à
   l'état de proposition : system_docker.yml n'applique que le data-root sur
   disque externe et les log-opts. Sans épinglage, le ramasse-miettes de Docker
   supprime l'image dès que le disque se remplit — panne déjà constatée sur les
   images de runner elles-mêmes.

Le rôle vérifie sa sortie (`docker run … bun --version`) au lieu de supposer que
le build a suffi, et l'image écrit ses versions dans /etc/ci-base.versions pour
que la CI de kadans puisse les confronter à son bun.lock et échouer FORT sur une
dérive, plutôt que de la découvrir en « Executable doesn't exist ».

Nouveau label runner `ci-node-playwright`. `container.force_pull: false` est
déjà en place et devient REQUIS pour ce label : sans lui, act_runner tenterait
un pull d'une image qui n'est dans aucun registre.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-07-29 20:23:59 +02:00
..
2024-08-16 13:53:03 +02:00
2024-07-05 16:16:11 +02:00
2024-07-05 16:16:11 +02:00
2024-12-15 22:13:03 +01:00

Ansible Collection - arcodange.factory

Documentation for the collection.

MY_TOKEN= #<my token (see https://www.duckdns.org/domains)>
kubectl create secret generic traefik-duckdns-token --from-literal="DUCKDNS_TOKEN=$MY_TOKEN" -n kube-system
%%{init: { 'logLevel': 'debug', 'theme': 'dark' } }%%
timeline
    title Playbook Execution Sequence
    section 01_system
        rpi
            : set hostname
        dns
            : install pi-hole
        ssl
            : step-ca
            : fetch root certificate
            : build docker image with CA
        prepare_disks
            : list partitions
            : format disk
            : mount disk
        system_docker
            : install docker
            : configure docker storage
            : restart docker
        longhorn
            : deploy longhorn
        k3s
            : prepare inventory
            : install k3s collection
            : install socat
            : deploy k3s cluster
            : configure kubeconfig
            : configure traefik
            : configure cert-manager
    section 02_setup
        backup_nfs
            : create RWX volume
            : create recurring job
            : deploy NFS
            : mount NFS
        postgres
            : create database
            : create user
        gitea
            : deploy gitea
            : create admin user
            : create organization
    section 03_cicd
        cicd : CI/CD
        gitea_token
            : generate token
        deploy_docker_compose
            : deploy gitea action
        argocd
            : generate token
            : deploy argocd
    section 04_tools
        Hashicorp Vault
            : gitea_token
            : hashicorp_vault
        Crowdsec
            : crowdsec
    section 05_backup
        Gitea Backup
            : gitea
        K3s PVC Backup
            : k3s_pvc
        Postgres Backup
            : create backup script
            : create restore script