Files
oto-enterprise-os-dtp/.gitea/workflows/ci.yml
T
Claude Code DTP Worker b1b011ab81 [DTP-Worker] Sprint 2 · Générateur plan User Permission (RBAC row-level scope_donnees → Frappe)
Complète le pipeline RBAC (Role + Custom DocPerm déjà livrés) par la dimension
row-level. Mapping natif ERPNext v15 des 4 scope_donnees :
- entite → User Permission allow=Company (28 templates, user=sentinelle)
- own    → if_owner (déjà posé par fixtures_gen)
- groupe → aucune restriction (vue consolidée)
- equipe → pas de dimension native → signalé VPS (jamais mappé, #6)

Module userperm_gen/ : permlib/{frappe,builder}, CLI build/validate (refuse
d'écrire si invariant KO), userperm.schema.json (validateur maison, zéro pip),
12 tests unittest, README. Job CI rbac-userperm-tests ajouté au gate.
Docs SPEC §7 + fixtures_gen README cousues. Régression 72 tests verts, gate OK.

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

165 lines
6.5 KiB
YAML

# ============================================================================
# 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
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]
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/