feat(webext): dual MV2/MV3 manifest + Chrome Web Store deploy

Contexte

Le support Chrome de l'extension navigateur a été perdu lors de la migration Cesium v1 → v2. Cesium v1 maintenait deux manifests (web-ext/manifest.json MV2 + chrome-ext/manifest.json MV3) via gulp ; cesium² ne gardait que MV2 Firefox. Le Chrome Web Store refuse les MV2 depuis janvier 2022, donc impossible d'y publier en l'état.

Cette MR rétablit le support Chrome en s'inspirant du pattern de duniter-connect (qui fonctionne en prod).

Architecture

Dual manifest avec swap pré-build

resources/webext/
├── manifest_firefox.json   # MV2 (commit, listing AMO existant)
├── manifest_chrome.json    # MV3 (commit, nouveau pour CWS)
└── manifest.json           # gitignored, généré par scripts/swap-webext-manifest.sh

Le script scripts/swap-webext-manifest.sh {firefox|chrome} copie le bon manifest comme manifest.json actif avant chaque ng build --configuration webext. angular.json ignore les manifest_*.json dans les assets du build webext, seul le manifest.json actif est embarqué.

Scripts ajoutés

  • scripts/swap-webext-manifest.sh — choix du manifest actif
  • scripts/chrome-zip.sh — zip de webext/release/cesium-{version}-chrome.zip (vérifie que le manifest est bien MV3)
  • scripts/chrome-publish.sh — OAuth refresh + upload + publish CWS (adapté de duniter-connect/scripts/publish.sh)

npm scripts

Nouveaux:

  • webext:build:firefox / webext:build:chrome
  • webext:package:firefox / webext:package:chrome
  • webext:deploy:firefox:{test,prod} / webext:deploy:chrome:{test,prod}

Les anciens (webext:build:prod, webext:package:prod, webext:deploy:test/prod) restent en alias Firefox pour compatibilité.

CI

6 nouveaux jobs:

  • package:webext:chrome (+ :feature)
  • deploy:webext:chrome:prerelease (+ :feature, :tags) — DEPLOY_ENVIRONMENT=test, upload draft sans review
  • deploy:webext:chrome:release (+ :feature, :tags) — DEPLOY_ENVIRONMENT=prod, upload + soumet pour review (CHROME_PUBLISH=1)

Tous en when: manual. Les jobs Firefox existants ne sont pas touchés (juste leurs scripts internes utilisent les noms :firefox: explicites).

Variables CI à ajouter (Settings → CI/CD → Variables, masked + protected)

  • CHROME_CLIENT_ID — OAuth2 client ID (Google Cloud Console)
  • CHROME_CLIENT_SECRET — OAuth2 client secret
  • CHROME_REFRESH_TOKEN — refresh token long-lived (procédure: scripts/publish.sh:71-94 de duniter-connect)
  • CHROME_EXTENSION_ID — ID 32 caractères de l'extension sur le Chrome Web Store

Testing

  1. Configurer les 4 variables CI ci-dessus
  2. Trigger manuellement deploy:webext:chrome:prerelease: sur develop → upload draft sur CWS, vérifier dans la Developer Dashboard
  3. Si OK : trigger deploy:webext:chrome:release: → soumet pour review Google

Notes

  • Firefox reste en MV2 (le listing AMO 2.2.1 est déjà publié et marche, pas de risque de re-validation). Migration MV3 Firefox = chantier séparé si souhaité.
  • background.js est déjà polyglot (browser.browserAction || chrome.action), aucun changement code.
  • L'image Docker CI doit avoir jq et zip ; ajout de apt-get install au before_script du job Chrome par sécurité.

Merge request reports

Loading