Commit e20c108f authored by Kourser's avatar Kourser
Browse files

CI : écrite pour un exécuteur shell, pas pour un conteneur

Le chemin du journal npm — /home/gitlab-runner/.npm — dit tout : le travail
tourne sur l'hôte, sous l'utilisateur de l'exécuteur, pas dans un conteneur.
Votre exécuteur est de type « shell ».

Ce que j'aurais dû lire au premier échec
  « corepack: command not found » n'était pas un manque de l'image node:24 :
  c'est que « image: » n'a jamais été appliqué. J'ai corrigé le symptôme, et le
  second échec — EACCES sur /usr/local — a redit la même chose plus fort.

Trois conséquences, toutes traitées
  « image: » est retiré plutôt que laissé en place : le garder laisserait croire
  que la version de Node est maîtrisée ici, alors qu'elle est celle de l'hôte.
  Node et pnpm annoncent désormais leur version en tête de chaque travail, pour
  que le prochain écart se voie sans aller-retour.

  Rien ne s'installe globalement. pnpm est posé dans le répertoire du projet et
  ajouté au PATH. npm ne peut pas le remplacer : les dépendances internes de ce
  dépôt sont déclarées en « workspace:* ».

  « services: » est ignoré aussi : aucune base, aucun cache, aucun stockage
  objet. Les 602 garanties ne peuvent donc pas tourner ici.

Un pipeline rouge en permanence n'apprend qu'une chose : à l'ignorer
  Le travail « garanties » ne se déclenche que si DATABASE_URL est définie dans
  les variables du projet. Tant qu'aucune base n'est disponible, il ne s'exécute
  pas — plutôt que d'échouer à chaque passage.

  Reste vérifié à chaque commit, sans aucun service : le typage, la couverture
  des accords de contribution, et la construction du site — dont les liens morts
  font échouer le travail.

Éprouvé en répétant les deux travaux à l'identique en local, jusqu'au « mv
site/build public » : 26 pages produites dans les deux langues, aucun lien mort.

Signed-off-by: default avatarKourser <contact@kourser.bzh>
Co-Authored-By: default avatarClaude Opus 5 <noreply@anthropic.com>
parent bb27abfc
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -16,3 +16,4 @@ kastell-face-au-marche.html
site/build/
site/.docusaurus/
public/
.ci/
+44 −34
Original line number Diff line number Diff line
# ═══════════════════════════════════════════════════════════════════════════
# Intégration continue et publication de la documentation.
#
# Deux travaux, et le second ne part que si le premier passe : publier une
# documentation depuis une révision qui ne tient pas ses garanties reviendrait
# à documenter un produit qui n'existe pas.
# Écrit pour un exécuteur « shell » : le travail tourne sur l'hôte, sous
# l'utilisateur gitlab-runner, pas dans un conteneur. Trois conséquences, qui
# expliquent tout ce qui suit :
#
# pnpm est installé par npm, pas par corepack : corepack n'est pas présent dans
# toutes les images Node, et l'espace de travail ne peut pas s'en passer — les
# dépendances internes sont déclarées en « workspace:* », que npm ne résout pas.
#   — « image: » serait ignoré : on ne le déclare pas, pour ne pas laisser
#     croire que la version de Node est maîtrisée ici.
#   — « services: » serait ignoré aussi : aucune base, aucun cache, aucun
#     stockage objet n'est disponible. La suite complète de garanties ne peut
#     donc pas tourner ici — voir le travail « garanties » plus bas.
#   — Rien ne s'installe globalement : l'utilisateur n'écrit pas dans
#     /usr/local. pnpm est donc installé dans le répertoire du projet.
#
# Ces choix restent valables sur un exécuteur Docker : ils n'y coûtent rien.
# ═══════════════════════════════════════════════════════════════════════════

stages: [verifier, publier]

default:
  image: node:24
  before_script:
    - npm install -g pnpm@9.12.3
    # pnpm installé dans le répertoire du projet, jamais globalement :
    # l'utilisateur de l'exécuteur n'écrit pas dans /usr/local. La version est
    # celle que déclare packageManager — npm ne résout pas les dépendances
    # « workspace:* » de ce dépôt, pnpm est donc requis.
    - npm install --no-save --no-audit --no-fund --prefix .ci pnpm@9.12.3
    - export PATH="$CI_PROJECT_DIR/.ci/node_modules/.bin:$PATH"
    # Le premier échec suivant sera diagnosticable sans aller-retour.
    - node --version
    - pnpm --version
    - pnpm config set store-dir "$CI_PROJECT_DIR/.pnpm-store"

cache:
@@ -23,37 +36,34 @@ cache:
    files: [pnpm-lock.yaml]
  paths: [.pnpm-store]

# ── Les garanties du produit ───────────────────────────────────────────────
# ── Ce qui se vérifie sans aucun service ───────────────────────────────────
verifications:
  stage: verifier
  services:
    - name: postgres:16
      alias: postgres
    - name: redis:7
      alias: redis
    - name: bitnami/minio:latest
      alias: minio
  variables:
    POSTGRES_USER: kastell
    POSTGRES_PASSWORD: verification
    POSTGRES_DB: kastell
    MINIO_ROOT_USER: kastell
    MINIO_ROOT_PASSWORD: verification-minio
    KASTELL_ENV: developpement
    KASTELL_URL_PUBLIQUE: http://localhost:8080
    DATABASE_URL: postgres://kastell:verification@postgres:5432/kastell
    REDIS_URL: redis://redis:6379
    S3_ENDPOINT: http://minio:9000
    S3_BUCKET: kastell
    S3_ACCES: kastell
    S3_SECRET: verification-minio
    S3_REGION: eu-west-1
    SECRET_SESSION: verification-verification-verification-01
  script:
    - pnpm install --frozen-lockfile
    - pnpm typecheck
    - pnpm verif
    - pnpm accords
    # Un lien mort fait échouer la construction : dans une documentation de
    # crise, c'est un défaut, pas un détail.
    - pnpm --filter @kastell/site build

# ── Les 602 garanties du produit ───────────────────────────────────────────
#
# Elles exigent PostgreSQL, Redis et un stockage objet. Sur un exécuteur shell
# sans ces services, ce travail ne se déclenche pas — plutôt que d'échouer à
# chaque passage et d'apprendre à tout le monde à ignorer un pipeline rouge.
#
# Pour l'activer : définir DATABASE_URL dans les variables du projet, en
# pointant vers une base dédiée à l'intégration. Le travail refuse de tourner
# si KASTELL_ENV vaut « production ».
garanties:
  stage: verifier
  needs: [verifications]
  rules:
    - if: $DATABASE_URL
  script:
    - pnpm install --frozen-lockfile
    - pnpm verif

# ── La documentation, publiée par GitLab Pages ─────────────────────────────
pages:
@@ -65,7 +75,7 @@ pages:
    # écrite en dur, pour qu'un auto-hébergeur qui reprend ce dépôt obtienne
    # la sienne sans rien modifier.
    - pnpm --filter @kastell/site build
    - mv site/build public
    - rm -rf public && mv site/build public
  artifacts:
    paths: [public]
  rules: