Corrige la bascule du catalogue, detecte un changement de depot, compte les packs a l'import
build / Images Harbor (catalog-sync, Dockerfile.catalog-sync) (push) Successful in 9m45s
build / Garde-fou (push) Successful in 10m18s
build / Images Harbor (web, Dockerfile) (push) Successful in 13m10s

This commit is contained in:
hcornet committed 2026-09-11 12:16:57 +02:00
1 parent 469305b4a7
commit c411f2933d
5 files changed
+116 -5

No files matched your search

+5
View File
@@ -40,6 +40,11 @@ jobs:
- name: Interface
run: sh tests/interface.sh
# La synchronisation du catalogue, sur un depot Git local : le defaut du
# 11/09 annoncait des publications reussies sans jamais basculer le lien.
- name: Synchronisation du catalogue
run: sh tests/sync.sh
images:
name: Images Harbor
runs-on: ubuntu-latest
+12
View File
@@ -3,6 +3,18 @@
Format : [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/).
Versionnement sémantique, comme décrit dans [docs/CONVENTIONS.md](docs/CONVENTIONS.md).
## 1.3.1
### Corrigé
- Bascule du catalogue : `mv` vers un lien pointant sur un répertoire le suivait au lieu
de le remplacer, et le site restait figé sur une ancienne révision pendant que la
synchronisation annonçait des publications réussies
- Un changement de dépôt du catalogue provoque désormais un nouveau clone
### Ajouté
- Nombre de packs affiché dans le titre de la fenêtre d'import
- Test de la synchronisation sur un dépôt Git local, exécuté par la CI
## 1.3.0
### Ajouté
+20 -4
View File
@@ -19,7 +19,8 @@ if [ -z "${CATALOG_REPO:-}" ]; then
while true; do sleep 3600; done
fi
TRAVAIL=/tmp/depot
# Emplacement du clone de travail, surchargeable pour les tests.
TRAVAIL=${CATALOG_TRAVAIL:-/tmp/depot}
TEMOIN=/tmp/derniere-revision-confirmee
# Previent l'application, et retient si elle a repondu. Tant que la reponse
@@ -39,6 +40,13 @@ prevenir_application() {
}
sync_une_fois() {
# Un clone existant dont l'origine a change tirerait indefiniment depuis
# l'ancien depot : on le refait plutot que de le mettre a jour.
if [ -d "$TRAVAIL/.git" ]; then
ORIGINE=$(git -C "$TRAVAIL" remote get-url origin 2>/dev/null || echo "")
[ "$ORIGINE" = "$CATALOG_REPO" ] || rm -rf "$TRAVAIL"
fi
if [ -d "$TRAVAIL/.git" ]; then
git -C "$TRAVAIL" fetch --quiet --depth 1 origin "$CATALOG_BRANCH" || return 1
git -C "$TRAVAIL" reset --quiet --hard "origin/$CATALOG_BRANCH" || return 1
@@ -66,9 +74,17 @@ sync_une_fois() {
cp -a "$SOURCE"/. "$CIBLE.partiel"/ || return 1
mv "$CIBLE.partiel" "$CIBLE" || return 1
# Bascule atomique du lien, puis menage des anciennes revisions.
ln -sfn "$CIBLE" "$CATALOG_DEST/actuel.neuf"
mv -f "$CATALOG_DEST/actuel.neuf" "$CATALOG_DEST/actuel" || return 1
# Bascule du lien. Surtout pas "mv vers actuel" : quand actuel est un lien
# vers un repertoire, mv le suit et depose le fichier a l'interieur au lieu
# de remplacer le lien. ln -sfn remplace le lien lui-meme, sans le suivre.
ln -sfn "$CIBLE" "$CATALOG_DEST/actuel" || return 1
rm -rf "$CATALOG_DEST"/rev-*/actuel.neuf "$CATALOG_DEST/actuel.neuf"
# Verification : sans elle, une bascule ratee passerait pour un succes.
if [ "$(readlink "$CATALOG_DEST/actuel")" != "$CIBLE" ]; then
echo "catalog-sync : la bascule du lien a echoue" >&2
return 1
fi
ls -1dt "$CATALOG_DEST"/rev-* 2>/dev/null | tail -n +$((REVISIONS_CONSERVEES + 1)) | while read -r vieux; do
rm -rf "$vieux"
+17 -1
View File
@@ -628,8 +628,17 @@ function ouvrirModale(titre, construire) {
function fermerModale() { document.getElementById('modal').hidden = true; }
function titreCatalogue(packs) {
return packs ? 'Importer un pack (' + packs.length + ')' : 'Importer un pack';
}
function majTitreModale(texte) {
var titre = document.getElementById('modal-titre');
if (titre) titre.textContent = texte;
}
function ouvrirCataloguePacks() {
ouvrirModale('Importer un pack', function (corps) {
ouvrirModale(titreCatalogue(packsCache), function (corps) {
var recherche = elt('input', { type: 'text', placeholder: 'Filtrer par nom, technologie, plugin...' });
corps.appendChild(recherche);
var resultats = elt('div', { className: 'packs' });
@@ -637,6 +646,13 @@ function ouvrirCataloguePacks() {
function afficher(packs) {
resultats.innerHTML = '';
if (Array.isArray(packs) && packsCache) {
majTitreModale(
packs.length === packsCache.length
? titreCatalogue(packsCache)
: 'Importer un pack (' + packs.length + ' sur ' + packsCache.length + ')'
);
}
if (!Array.isArray(packs)) {
resultats.appendChild(elt('div', {
className: 'notice bad',
+62
View File
@@ -0,0 +1,62 @@
#!/bin/sh
# Verifie la synchronisation du catalogue sur un vrai depot Git local.
#
# Le defaut corrige le 11/09/2026 ne se voyait qu'a la deuxieme revision : la
# premiere bascule creait le lien, la seconde le suivait au lieu de le
# remplacer, et le catalogue restait fige pendant que le script annoncait des
# publications reussies. Ce test joue donc deux revisions.
#
# sh tests/sync.sh
set -eu
TRAVAIL=$(mktemp -d /tmp/enclume-sync-XXXXXX)
trap 'rm -rf "$TRAVAIL"' EXIT
DEPOT="$TRAVAIL/depot"
DESTINATION="$TRAVAIL/catalogue"
mkdir -p "$DEPOT/catalog/system" "$DESTINATION"
cd "$DEPOT"
git init --quiet --initial-branch=main
git config user.email "[email protected]"
git config user.name "Essai"
echo "premier: pack" > catalog/system/premier.yml
git add -A && git commit --quiet -m "premiere revision"
cd - > /dev/null
lancer_un_cycle() {
CATALOG_REPO="$DEPOT" CATALOG_DEST="$DESTINATION" CATALOG_BRANCH=main \
CATALOG_SUBDIR=catalog SYNC_INTERVAL=1 RELOAD_URL="" \
CATALOG_TRAVAIL="$TRAVAIL/clone" \
timeout 20 sh docker/catalog-sync.sh > "$TRAVAIL/journal" 2>&1 || true
}
echouer() {
echo "ECHEC : $1"
echo "--- journal ---"
cat "$TRAVAIL/journal" 2>/dev/null || true
echo "--- arborescence ---"
ls -la "$DESTINATION"
exit 1
}
# Premiere revision
lancer_un_cycle
[ -L "$DESTINATION/actuel" ] || echouer "actuel n'est pas un lien symbolique"
[ -f "$DESTINATION/actuel/system/premier.yml" ] || echouer "le premier pack n'est pas publie"
# Seconde revision : c'est ici que le defaut se manifestait
cd "$DEPOT"
echo "second: pack" > catalog/system/second.yml
git add -A && git commit --quiet -m "seconde revision"
ATTENDU=$(git rev-parse --short HEAD)
cd - > /dev/null
lancer_un_cycle
OBTENU=$(basename "$(readlink "$DESTINATION/actuel")")
[ "$OBTENU" = "rev-$ATTENDU" ] || echouer "actuel pointe sur $OBTENU au lieu de rev-$ATTENDU"
[ -f "$DESTINATION/actuel/system/second.yml" ] || echouer "le second pack n'est pas publie"
[ -e "$DESTINATION/actuel/actuel.neuf" ] && echouer "un lien parasite a ete depose dans la revision"
echo "synchronisation : bascule correcte sur deux revisions successives"