- Shell 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Le type de notification des images d intégrations devient integration-update (ex image-update), conformément à la carte NTFY asami-updates amendée. Payload et affichages du pilote et README mis à jour ; champs inchangés. Assisted-by: Ventoline <ventdunord@asami.rocks> |
||
| images | ||
| asami-image-publish | ||
| README.md | ||
asami-images-build-tools
Pilote commun de build, qualification et publication des images Docker Asami externalisées (asami-sentry, asami-browsers). Un seul driver, asami-image-publish, et une config par image, images/*.conf.
Les dépôts des images restent propriétaires de leur Dockerfile et de leurs recettes de qualification (recipes/). Ce dépôt encode seulement la manière de construire le candidat, de prouver la qualification contre l'image candidate, de publier en référence immuable et d'informer les instances Asami.
Usage
./asami-image-publish --image asami-sentry --version 2026.11.4 --repo <checkout asami-sentry> --git-repo-claimed
./asami-image-publish --image asami-browsers --version 2026.11.4 --repo <checkout asami-browsers> --git-repo-claimed
Options :
- --dry-run : preflight + build + qualification uniquement, aucune mutation. Pas besoin de --git-repo-claimed ni du token ntfy.
- --git-repo-claimed : atteste que l'appelant détient le claim Coordination git_repo sur le dépôt de l'image au moment de la mutation. Exigé avant toute mutation distante (push registry, tag git). Le claim reste à la charge de l'agent appelant — ce pilote ne réserve jamais le dépôt à sa place.
Cycle du pilote
- Preflight read-only : outils présents, checkout propre, HEAD relevé, origin cohérent avec le projet, tag absent en local et en distant, tag absent du registry (JWT pull anonyme, HTTP 404 attendu), glab authentifié, token ntfy provisionné en mode 600 exact.
- Build du candidat : les pins vivent dans le Dockerfile de l'image (fail-closed — tout mouvement de base ou de moteur fait échouer le build).
- Qualification : les recettes du dépôt de l'image sont exécutées contre l'image candidate ; chaque marqueur requis doit figérer dans la sortie.
- Publication registry : docker login par token glab (password-stdin), push, logout immédiat via trap, puis readback anonyme du manifest — le digest relu doit être identique au digest du push.
- Tag git annoté portant le même numéro CalVer (Tagger Ventoline), push du tag, readback ls-remote (tag présent, tag pelé = commit du checkout).
- Notification NTFY — uniquement après un succès complet.
Contrat de notification (asami-notify/v1, topic asami-updates)
Envoyé en dernier, uniquement si tout a réussi. JSON dans le body, Authorization Bearer avec le token write-only de l'utilisateur ntfy asami-build :
{
"asami_notify": "v1",
"notification_type": "integration-update",
"integration_name": "sentry",
"update_version": "2026.11.4",
"image": "registry.gitlab.com/lodlp/asami-tools/asami-sentry:2026.11.4@sha256:...",
"compose_service": "sentry-mcp",
"release_url": "https://gitlab.com/lodlp/asami-tools/asami-sentry/-/tags/2026.11.4",
"summary": "Image Sentry MCP externalisée"
}
Title : asami-images-build — image version. Les instances Asami s'abonnent au topic en lecture anonyme ; le superviseur met à jour ou crée le service compose désigné par compose_service, par digest immuable.
Secrets
- Token registry : lu dans ~/.config/glab/config.yml (awk), passé par docker login --password-stdin, logout immédiat. Jamais affiché.
- Token ntfy : fichier ~/.config/asami/ntfy-asami-updates-rw.token.txt, mode 600 exact (surcharge : variable d'environnement ASAMI_NTFY_TOKEN_FILE). Jamais affiché, jamais commis, jamais dans un log.
Aucun secret ne vit jamais dans ce dépôt.
Invariants
- CalVer YYYY.M.D[.N] ; le tag git annoté et le tag d'image portent le même numéro ; latest n'existe pas ; la référence canonique est version@digest.
- Identités git : Author Olivier Cortès olive@asami.rocks, Committer Ventoline ventdunord@asami.rocks, Tagger Ventoline, trailer Assisted-by.
- Fail-closed partout : pins Dockerfile, marqueurs de qualification, readbacks obligatoires, notification obligatoire après publication réussie.
- Pas de CI (décision GITLAB.md) : publication depuis un Atelier provisionné (publisher) avec la clé SSH dédiée du dépôt de l'image.
Qualification par image
- asami-sentry : smoke offline de l'image finale (non-root, labels revision, intégrité des fichiers, protocole MCP STDIO) — marqueur SENTRY_IMAGE_OFFLINE_PASS. Le build passe d'abord par le stage sentry-mcp-build et son smoke STDIO hors réseau.
- asami-browsers : extraction des 5 fichiers du daemon depuis l'image, smokes superviseur et backend (pilote factice) — marqueur SMOKE_PASS — puis bench BiDi réel contre le superviseur de l'image (CMD, port 8790) — marqueur BIDI_REQUAL_PASS firefox=153.6.0esr-1~deb13u1. Les pins des moteurs vivent dans le dépôt asami-browsers (table de pins qualifiée).
Références
- Planka : « NTFY topic asami-updates pour les mises à jour » (protocole asami-notify/v1), « GITLAB.md », « GIT.md », « RELEASE-WORKFLOW », « Rationale — architecture et invariants Asami ».
- Premières livraisons (pilotées manuellement le 2026-11-03) : asami-sentry 2026.11.3 (sha256:7416e4b9...), asami-browsers 2026.11.3 (sha256:e6f1a98b...).