# CI/CD · OTO Enterprise OS DTP · Gitea Actions > **Livrable Sprint 1** (roadmap `04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md` §Sprint 1 · DevOps) > _« CI/CD Gitea Actions »_ — gate qualité qui conditionne tous les sprints suivants. > > **Plateforme : Gitea Actions UNIQUEMENT** (CLAUDE.md contrainte #2 · JAMAIS GitHub). --- ## 1. Ce que fait le pipeline Workflow : `.gitea/workflows/ci.yml`. Déclenché sur `push` / `pull_request` vers `main` et manuellement (`workflow_dispatch`). Quatre jobs : | Job | Script | Rôle | Blocant | |---|---|---|---| | `constraints-guard` | `ci/guard_constraints.sh` | Enforce les contraintes NON-NÉGOCIABLES de CLAUDE.md | ✅ oui | | `validate-json` | `ci/validate_json.sh` | Parse strict de tous les `*.json` (schémas Faisabilité↔Publiciste) | ✅ oui | | `check-docs` | `ci/check_docs.sh` | Liens Markdown internes + présence auto-score 4Big | ✅ oui (liens) | | `gate` | — | Agrégat vert = gate qualité 4Big franchi | ✅ oui | Aucune dépendance réseau/marketplace hors `actions/checkout`. Tout tourne avec `bash` + `git` + `python3` (déjà présents sur un runner standard). ## 2. Détail des contrôles ### `guard_constraints.sh` — contraintes NON-NÉGOCIABLES Détecte l'**usage** (pas la simple mention) de : - Plateformes git interdites : `github.com`, `gitlab.com`, `bitbucket.org` (#2). - CRM interdits : `EspoCRM`, `HubSpot` (#3). - Paiement interdit : `Stripe` (#10 · Cardnet only). - Écriture directe dans `/var/www/html/static/` (Interdit absolu). - Commande `git clean` (Interdit absolu). - Remote git pointant ailleurs que Gitea/interne. **Zéro faux positif** : une ligne contenant un marqueur de prohibition (`jamais`, `❌`, `only`, `pas de`, `interdit`…) est un rappel de règle → ignorée. Escape hatch documenté : ajouter `ci-allow` sur une ligne pour l'exclure. ### `validate_json.sh` Parse chaque `*.json` suivi (dont `version.schema.json` et `projets_master.schema.json`, contrat de données Faisabilité → Publiciste). Un JSON cassé casse le pipeline aval → attrapé ici. ### `check_docs.sh` - **[HARD]** liens Markdown relatifs internes : la cible doit exister. - **[SOFT]** livrables `05_deliverables_mvp/*.md` : mention d'auto-score 4Big attendue (≥95/100, CLAUDE.md #5). Avertissement seul, non blocant. ## 3. Exécution locale (avant push) ```bash bash ci/guard_constraints.sh # contraintes CLAUDE.md bash ci/validate_json.sh # schémas JSON bash ci/check_docs.sh # liens + score ``` Chaque script retourne `0` si conforme, `1` sinon. Reproduit exactement ce que fait la CI (mêmes scripts, aucune logique cachée côté YAML). ## 4. Enregistrement du runner Gitea (ops · à faire sur le VPS) > ⚠ Étape **hors périmètre de ce worker** (touche au VPS). À réaliser par > l'agent DevOps. Documenté ici pour traçabilité. Le workflow cible un runner avec le label `ubuntu-latest`. Sur le VPS Gitea (`:3015`), enregistrer un `act_runner` : ```bash # Sur le VPS, récupérer le token runner : # Gitea → Site Administration → Actions → Runners → Create new Runner act_runner register \ --instance http://153.75.250.214:3015 \ --token \ --labels ubuntu-latest:docker://node:20-bookworm \ --name oto-dtp-runner act_runner daemon # ou service systemd dédié ``` Vérifier ensuite : Gitea → repo `michel/oto-enterprise-os-dtp` → **Settings → Actions** doit être activé, et le runner doit apparaître « Idle ». ## 5. Checklist de vérification (DevOps, sur VPS) - `[ ]` Gitea Actions activé au niveau instance ET repo. - `[ ]` `act_runner` enregistré, label `ubuntu-latest`, statut Idle. - `[ ]` Push de test → les 4 jobs apparaissent et passent au vert. - `[ ]` PR de test avec violation volontaire → `constraints-guard` bloque (rouge). --- **Auto-score 4Big du livrable : 96/100.** _Réserve −4_ : l'enregistrement du runner (§4) est hors périmètre repo et reste à confirmer sur le VPS par DevOps ; tant que le runner n'est pas Idle, la CI ne s'exécute pas côté serveur bien que les scripts soient validés localement.