Files
oto-enterprise-os-dtp/.gitea/workflows/ci.yml
T
Claude Code DTP Worker 58ed555db0 [DTP-Worker] Sprint 8 · Générateur Run-book de déploiement VPS unifié (7 phases · 20 modules gated · couverture bijective vs CI) (DevOps · roadmap L73)
Agrégateur de méta-niveau au-dessus du run-book RBAC : ordonne le déploiement
VPS de TOUS les livrables gated en 7 phases (Prérequis → DocTypes → RBAC →
Workflow/métier → Frontend → Contenu → Vérification QA), avec graphe de
dépendances inter-phases acyclique et confirmations préalables sourcées.

Anti-invention (#6) : périmètre dérivé du CI (parse_ci réutilisé), couverture
bijective module→phase (un module gated non planifié OU un module planifié non
gated → refus), SoD (auto-exclusion), zéro chiffre métier (confirmations
sourcées via audit_5d D1.1/D1.2/D1.3/D2.3 + endpoint OTOIA).

Vérifs : 29/29 tests module (dont 14 injections négatives) · audit_4big PASS
20/20 à 100 · régression run 20/20 suites · 503 tests · 0 échec · gate CI local
vert. CI job devops-deploy-runbook-tests + gate ; enregistrement audit_4big
(19→20) ; plan régression régénéré (19→20 suites).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 11:41:43 +00:00

445 lines
20 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ============================================================================
# CI · OTO Enterprise OS DTP · Gitea Actions
# ----------------------------------------------------------------------------
# Gate qualité DevOps (roadmap Sprint 1 · GAP_ANALYSIS §7).
# Plateforme : Gitea Actions UNIQUEMENT (CLAUDE.md #2 · JAMAIS GitHub).
# Runner : act_runner enregistré sur le VPS avec le label « ubuntu-latest ».
# Voir ci/README.md pour l'enregistrement du runner.
# Aucune dépendance réseau/marketplace externe hors actions/checkout.
# ============================================================================
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
jobs:
constraints-guard:
name: Contraintes NON-NÉGOCIABLES (CLAUDE.md)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Guard des contraintes
run: bash ci/guard_constraints.sh
validate-json:
name: Validation JSON (schémas Faisabilité)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Valider les JSON
run: bash ci/validate_json.sh
check-docs:
name: Qualité documentaire (liens + 4Big)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Contrôle docs
run: bash ci/check_docs.sh
# --------------------------------------------------------------------------
# Publiciste (Sprint 2) : parser faisabilité → projets_master.json + generator.
# Tests unitaires stdlib pur (unittest) → aucune installation pip requise sur
# le runner. L'oracle jsonschema est utilisé s'il est présent, sinon ignoré.
# --------------------------------------------------------------------------
publiciste-tests:
name: Publiciste · parser + schéma + generator (unittest)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/publiciste
steps:
- uses: actions/checkout@v4
- name: Tests unitaires Publiciste
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# RBAC 50 rôles (Sprint 2 · ERPNext Backend) : contrat rbac_50_roles.json vs
# rbac.schema.json. Réutilise le validateur maison Publiciste (pas de pip).
# --------------------------------------------------------------------------
rbac-tests:
name: RBAC · 50 rôles + schéma (unittest)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/rbac
steps:
- uses: actions/checkout@v4
- name: Tests contrat RBAC
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur Faisabilité 4 volets (Sprint 2 · Faisabilité) : brief.json →
# data_room/PXX/ (template v1.0). Le round-trip via le parser Publiciste est
# testé ici (générateur → parser → schéma). stdlib pur, aucune install pip.
# --------------------------------------------------------------------------
faisabilite-gen-tests:
name: Faisabilité · générateur 4 volets + round-trip (unittest)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/faisabilite/generator
steps:
- uses: actions/checkout@v4
- name: Tests générateur Faisabilité
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de fixtures ERPNext (Sprint 2 · ERPNext Backend) : le contrat
# rbac_50_roles.json → fixtures Frappe `Role` + `Custom DocPerm`. Valide le
# bundle contre fixtures.schema.json + invariants (50 rôles, séparation des
# pouvoirs, round-trip fidèle au contrat). stdlib pur, aucune install pip.
# --------------------------------------------------------------------------
rbac-fixtures-tests:
name: RBAC · fixtures ERPNext (Role + Custom DocPerm)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/rbac/fixtures_gen
steps:
- uses: actions/checkout@v4
- name: Tests générateur de fixtures RBAC
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de plan User Permission (Sprint 2 · ERPNext Backend) : le contrat
# rbac_50_roles.json → plan row-level (scope_donnees → mécanisme Frappe natif +
# template User Permission allow=Company pour la portée `entite`). Valide le
# plan contre userperm.schema.json + invariants (couverture bijective des 50
# rôles, template SSI `entite`, anti-invention utilisateur). stdlib pur.
# --------------------------------------------------------------------------
rbac-userperm-tests:
name: RBAC · plan User Permission (row-level)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/rbac/userperm_gen
steps:
- uses: actions/checkout@v4
- name: Tests générateur de plan User Permission
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de Role Profile (Sprint 2 · ERPNext Backend) : le contrat
# rbac_50_roles.json → un `Role Profile` ERPNext v15 natif par portail (bundle
# de rôles assignable en un geste). Valide le bundle contre
# roleprofile.schema.json + invariants (couverture bijective des 50 rôles, un
# profil par portail, cohérence portail, anti-invention). stdlib pur.
# --------------------------------------------------------------------------
rbac-roleprofile-tests:
name: RBAC · Role Profile (bundles par portail)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/rbac/roleprofile_gen
steps:
- uses: actions/checkout@v4
- name: Tests générateur de Role Profile
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Agrégateur RBAC (Sprint 2 · ERPNext Backend) : recoud les 3 volets RBAC
# (fixtures Role+DocPerm, plan User Permission, Role Profile) en un run-book
# d'application VPS ordonné (SPEC §7) + un manifeste agrégé. Valide contre
# apply_plan.schema.json + invariants (ordre + graphe de dépendances SPEC §7,
# cohérence inter-volets, couverture bijective des 50 rôles). stdlib pur.
# --------------------------------------------------------------------------
rbac-applyplan-tests:
name: RBAC · run-book d'application unifié (agrégat 3 volets)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/rbac/apply_plan
steps:
- uses: actions/checkout@v4
- name: Tests agrégateur RBAC
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de dossier bancable trilingue (Sprint 3 · Faisabilité) : le même
# brief.json → data_room/PXX/50_financier_bancable/{fr,en,es}.md + manifest.json
# (répertoire jusqu'ici vide qu'exige le Portail Bancables 4Big). Figures
# sourcées verbatim + agrégats calculés de façon traçable (formule recoupée).
# Valide le manifeste contre bancable.schema.json + invariants (3 langues,
# bannière CONFIDENTIEL, anti-invention, recalcul des figures). stdlib pur.
# --------------------------------------------------------------------------
bancable-tests:
name: Faisabilité · dossier bancable trilingue FR/EN/ES
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/faisabilite/bancable
steps:
- uses: actions/checkout@v4
- name: Tests générateur bancable trilingue
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de workflow vente ERPNext (Sprint 4 · CRM natif) : le contrat
# pipeline workflow_vente_spec.json (lead → visite → devis → réservation →
# contrat → CONFOTUR) → fixtures Frappe Workflow + Workflow State + Workflow
# Action Master. Rôles résolus depuis rbac_50_roles.json (zéro duplication).
# Valide le schéma de sortie + 9 invariants de graphe (monotonie doc_status,
# atteignabilité, séparation des pouvoirs). stdlib pur, zéro pip.
# --------------------------------------------------------------------------
crm-workflow-vente-tests:
name: CRM · workflow vente ERPNext (lead → CONFOTUR)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/crm/workflow_vente
steps:
- uses: actions/checkout@v4
- name: Tests générateur workflow vente
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur du DocType porteur (Sprint 4 · CRM natif) : doctype_spec.json +
# workflow_vente_spec.json → fixture Frappe `DocType` custom `OTO Dossier
# Vente`, cible du Workflow `OTO Vente Pipeline`. Cross-cohérence workflow ↔
# DocType : champ d'état + valeurs de statut + is_submittable + permissions
# DÉDUITS du pipeline ; rôles résolus depuis rbac_50_roles.json (zéro
# duplication). Valide le schéma de sortie + 12 invariants. stdlib pur, zéro pip.
# --------------------------------------------------------------------------
crm-dossier-vente-tests:
name: CRM · DocType porteur OTO Dossier Vente
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/crm/dossier_vente
steps:
- uses: actions/checkout@v4
- name: Tests générateur DocType Dossier Vente
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Barème commissions vendeurs (Sprint 4 · ERPNext Backend « commissions
# vendeurs auto »). Cross-cohérence barème ↔ workflow ↔ DocType ↔ RBAC : chaque
# évènement paie sur un état SOUMIS, sur un champ Currency réel du Dossier
# Vente, pour un rôle ventes résolu. Anti-invention (#6) : aucun taux fixé
# (taux_pct null tant qu'à confirmer) ; calcul commission = base × taux
# traçable. Valide le schéma de sortie + 10 invariants. stdlib pur, zéro pip.
# --------------------------------------------------------------------------
crm-commissions-tests:
name: CRM · barème commissions vendeurs
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/crm/commissions
steps:
- uses: actions/checkout@v4
- name: Tests générateur barème commissions
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Intégration e-CF DGII (Sprint 4 · ERPNext Backend « e-CF DGII intégration
# (Compupar) »). Génère un plan de configuration de facturation électronique
# dominicaine cross-cohérent : chaque émission se déclenche sur un état SOUMIS
# du workflow, sur un champ Currency réel du Dossier Vente, par le rôle Compta
# Fiscaliste eCF résolu. Anti-invention (#6) : RNC / ITBIS / TipoCambio /
# endpoints Compupar restent null (a_confirmer) — jamais fabriqués ; composeur
# d'e-NCF traçable (E+tipo(2)+seq(10)). Schéma de sortie + 12 invariants +
# FormaPago Cardnet (#10). stdlib pur, zéro pip.
# --------------------------------------------------------------------------
fiscal-ecf-tests:
name: Fiscal · e-CF DGII (Compupar)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/fiscal/ecf_dgii
steps:
- uses: actions/checkout@v4
- name: Tests générateur e-CF DGII
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur de Workspaces ERPNext (Sprint 4 · Frontend Console « 5 portails
# rôle »). Un `Workspace` natif v15 par portail métier (Ventes/Construction/
# Achat/Compta/Direction) — le portail de landing par rôle du desk (#1 ERPNext
# natif). Cross-cohérence Workspace ↔ RBAC : chaque lien/raccourci vise un
# DocType présent dans les permissions_cibles du portail (anti-invention #6),
# couverture exhaustive, rôles restreints dérivés du contrat, tokens de marque
# repris de CLAUDE.md #4. Schéma de sortie + 12 invariants. stdlib pur, zéro pip.
# --------------------------------------------------------------------------
frontend-portails-tests:
name: Frontend · Workspaces 5 portails rôle
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/frontend/portails
steps:
- uses: actions/checkout@v4
- name: Tests générateur de Workspaces
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Générateur du DocType `CONFOTUR Application` (Sprint 5 · ONAPI/Legal · roadmap
# L55 « Refactor oto_module_confotur_application.py → dépôts automatiques »).
# DocType custom porteur des dossiers d'incitation touristique CONFOTUR
# (Ley 158-01, RD). Cross-cohérence DocType ↔ RBAC ↔ workflow : les permissions
# SONT, mot pour mot, les permissions_cibles RBAC (rôles ventes-confotur /
# legal-onapi / legal-directeur) ; le caractère soumissible en découle ;
# `estado`/`dossier_vente` dérivent du workflow_vente ; aucun taux/loi/montant
# CONFOTUR n'est fabriqué (#6). Schéma de sortie + 14 invariants. stdlib pur.
# --------------------------------------------------------------------------
legal-confotur-tests:
name: Legal · DocType CONFOTUR Application
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/legal/confotur
steps:
- uses: actions/checkout@v4
- name: Tests générateur CONFOTUR Application
run: python3 -m unittest discover -s tests -v
qa-audit-5d-tests:
name: QA · Audit 5D conformité
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/qa/audit_5d
steps:
- uses: actions/checkout@v4
- name: Tests générateur Audit 5D
run: python3 -m unittest discover -s tests -v
seo-tests:
name: SEO · mots-clés trilingues + schema.org + hreflang
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/seo
steps:
- uses: actions/checkout@v4
- name: Tests générateur SEO
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Chat OTOIA embarqué (Sprint 6 · ERPNext Backend · roadmap L63 « Chat OTOIA
# embedded dans chaque portail »). Un `Custom Block` natif v15 (#1) par portail
# métier, inséré dans le `content` du Workspace, + sa config runtime (persona
# Amélie, langues seo, rôles autorisés, portée de connaissance). Cross-cohérence
# Chat ↔ RBAC ↔ Workspaces : `roles_allowed`/`knowledge_scope` = surface RBAC
# EXACTE du portail (mêmes valeurs que les Has Role des Workspaces) ; endpoint
# OTOIA = null (a_confirmer · #6/#8). Schéma de sortie + 14 invariants. stdlib pur.
# --------------------------------------------------------------------------
chat-otoia-tests:
name: Chat OTOIA · montage par portail (Custom Block)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/frontend/chat_otoia
steps:
- uses: actions/checkout@v4
- name: Tests générateur Chat OTOIA
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Audit 4Big qualité (Sprint 7 · QA · roadmap L69 « Audit 4Big niveau 95+/100
# sur 100% deliverables »). Audit de MÉTA-NIVEAU : note la qualité 4Big de TOUS
# les livrables gated (documentation, contrat schema, couverture de tests, CLI
# reproductible, intégrité du hand-off out/) et exige ≥ 95/100 sur chacun
# (CLAUDE.md #5). Le périmètre « 100% » est PROUVÉ : le registre est recoupé
# bijectivement avec les working-directory du CI (moins l'auditeur · SoD ISA
# 315). Anti-invention (#6) : chaque note est RECALCULÉE depuis des faits du
# dépôt, jamais saisie. Schéma de sortie + invariants. stdlib pur, zéro pip.
# --------------------------------------------------------------------------
qa-audit-4big-tests:
name: QA · Audit 4Big (95+/100 sur 100% deliverables)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/qa/audit_4big
steps:
- uses: actions/checkout@v4
- name: Tests générateur Audit 4Big
run: python3 -m unittest discover -s tests -v
demo-scenario-tests:
name: Démo · Scénarios (run-sheet P07 banquier / P05 client)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/demo/scenarios
steps:
- uses: actions/checkout@v4
- name: Tests générateur Scénarios démo
run: python3 -m unittest discover -s tests -v
# --------------------------------------------------------------------------
# Matrice de régression exhaustive (Sprint 8 · QA · roadmap L74 « Regression
# tests exhaustifs »). Harnais de MÉTA-NIVEAU : recense TOUTES les suites de
# tests gated (dérivées du CI — zéro liste à la main · #5), prouve la
# couverture (disque + gate), et fournit — via `run` — le compte agrégé
# faisant autorité (« N tests verts »). Anti-invention (#6) : le plan ne
# contient AUCUN compteur de résultat ; ceux-ci ne naissent qu'à l'exécution.
# Ce job teste le harnais (parseur unittest, découverte, invariants) sans
# ré-exécuter les suites (le gate le fait déjà, job par job). stdlib pur.
# --------------------------------------------------------------------------
qa-regression-tests:
name: QA · Matrice de régression exhaustive (Sprint 8)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/qa/regression
steps:
- uses: actions/checkout@v4
- name: Tests harnais de régression
run: python3 -m unittest discover -s tests -v
devops-deploy-runbook-tests:
name: DevOps · Run-book de déploiement VPS unifié (Sprint 8)
runs-on: ubuntu-latest
defaults:
run:
working-directory: 05_deliverables_mvp/devops/deploy_runbook
steps:
- uses: actions/checkout@v4
- name: Tests run-book de déploiement
run: python3 -m unittest discover -s tests -v
gate:
name: Gate qualité (agrégat)
runs-on: ubuntu-latest
needs: [constraints-guard, validate-json, check-docs, publiciste-tests, rbac-tests, faisabilite-gen-tests, rbac-fixtures-tests, rbac-userperm-tests, rbac-roleprofile-tests, rbac-applyplan-tests, bancable-tests, crm-workflow-vente-tests, crm-dossier-vente-tests, crm-commissions-tests, fiscal-ecf-tests, frontend-portails-tests, legal-confotur-tests, qa-audit-5d-tests, seo-tests, chat-otoia-tests, qa-audit-4big-tests, demo-scenario-tests, qa-regression-tests, devops-deploy-runbook-tests]
steps:
- name: Résultat
run: echo "✅ Gate qualité 4Big franchi — tous les checks verts."
# --------------------------------------------------------------------------
# E2E baseline (QA · Sprint 1). MANUEL uniquement (workflow_dispatch) : exige
# un serveur live + navigateurs → hors du gate push/PR (checks statiques).
# Cible via DTP_BASE_URL (variable/secret repo). Voir tests/README.md.
# --------------------------------------------------------------------------
e2e-baseline:
name: E2E baseline Playwright (manuel)
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch'
defaults:
run:
working-directory: tests
env:
CI: "true"
DTP_BASE_URL: ${{ vars.DTP_BASE_URL }}
steps:
- uses: actions/checkout@v4
- name: Installer dépendances + navigateurs
run: |
npm install
npm run install:browsers
- name: Lancer la baseline E2E
run: npm test
- name: Publier le rapport
if: always()
uses: actions/upload-artifact@v4
with:
name: playwright-report
path: tests/playwright-report/