Files
shared-actions/.gitea/workflows/quality-gates.yml
T
LucaZanni 67fccd84e2 ✨ feat(ci): nessun modulo puo' dichiarare ruoli in auth.ruoli
- nuovo step in quality-gates.yml: cerca INSERT INTO auth.ruoli nei file .sql di
  migrations, seeds, sql e database/migrations, e fallisce spiegando cosa fare
  invece — dichiarare un gruppo d'area con i propri permessi, scegliendo il
  livello fra i tredici di piattaforma
- il contratto esisteva dal seed 13 di node-user-profiling e prevedeva questo
  controllo, che non era mai stato scritto: nove microfrontend lo hanno
  disatteso, 21 ruoli creati e 27 su 35 senza omonimo PostgreSQL. Un ruolo cosi'
  nel claim role del JWT e' un SET ROLE che non riesce, e l'utenza di collaudo
  del timesheet ne era la prova
- il boundary dopo `ruoli` tiene fuori auth.ruolipermessi; le righe di commento
  sono ignorate perche' spesso spiegano proprio questa regola
- una-tantum e rollback sono escluse: raccolgono delta generati e script di
  ritorno, fotografie di stati passati che riscrivere falserebbe
- nuovo input owns-auth-roles (default false): solo node-user-profiling, che
  possiede lo schema, lo mette a true. Unica deroga, ed e' esplicita
- verificato su tutti i 30 frontend con migrazioni e sui backend principali:
  nessuno fallisce dopo la ripulitura dei nove repo

Fixes #7 @1h
2026-08-28 10:40:25 +02:00

132 lines
5.1 KiB
YAML

name: Quality Gates
on:
workflow_call:
inputs:
working-directory:
description: 'Cartella che contiene package.json, relativa alla root del repo. Default: la root.'
type: string
default: '.'
node-version:
type: string
default: '24.16.0'
npm-version:
type: string
default: ''
owns-auth-roles:
description: >-
Solo per il repository proprietario di auth.ruoli (node-user-profiling):
gli consente di dichiarare ruoli nelle proprie migrazioni. Ogni altro
repo deve lasciarlo a false, e il gate qui sotto glielo impedisce.
type: boolean
default: false
jobs:
quality-gates:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ${{ inputs.working-directory || '.' }}
steps:
- name: Checkout
uses: https://gitea.com/actions/checkout@v6
- name: Setup Node.js
uses: https://gitea.com/actions/setup-node@v4
with:
node-version: ${{ inputs.node-version || '24.16.0' }}
- name: Upgrade npm
if: inputs.npm-version != ''
run: npm install -g npm@${{ inputs.npm-version }}
- name: Cache npm
uses: https://github.com/actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Configure npm private registry
run: |
echo "@pzeta:registry=https://gitea.pzetatouch.it/api/packages/PZeta_Touch/npm/" >> ~/.npmrc
echo "//gitea.pzetatouch.it/api/packages/PZeta_Touch/npm/:_authToken=${{ secrets.NPM_TOKEN }}" >> ~/.npmrc
- name: Nessun ruolo dichiarato fuori da node-user-profiling
if: ${{ !inputs.owns-auth-roles }}
shell: bash
run: |
# `auth.ruoli` appartiene a node-user-profiling e il suo contratto (seed
# 13, esteso dalla migrazione 19) vieta agli altri moduli di crearne.
# Non e' una formalita': il claim `role` del JWT e' il primo ruolo
# applicativo dell'utente e PostgREST ci fa un SET ROLE, ma i ruoli
# PostgreSQL esistono solo per i tredici livelli di piattaforma. Un
# ruolo per-modulo in quel claim e' una sessione che non parte.
# Nove microfrontend lo avevano disatteso: 21 ruoli, 27 su 35 senza
# omonimo PostgreSQL. Questo controllo esiste perche' non si ripeta.
set -uo pipefail
dirs=""
for d in migrations seeds sql database/migrations; do
[ -d "$d" ] && dirs="$dirs $d"
done
if [ -z "$dirs" ]; then
echo "Nessuna cartella di migrazioni: controllo non applicabile."
exit 0
fi
# Il boundary dopo `ruoli` evita che auth.ruolipermessi finisca fra i
# match; il filtro sulle righe che iniziano per -- lascia passare i
# commenti, che spiegano spesso proprio questa regola.
# Fuori dal controllo le cartelle che non alimentano il catalogo delle
# migrazioni: `una-tantum` raccoglie i delta generati per riallineare a
# mano un tenant, `rollback` gli script di ritorno. Sono strumenti
# operativi, spesso fotografie di uno stato passato, e riscriverli
# significherebbe falsare la storia che documentano.
hits=$(grep -rniE --include='*.sql' \
--exclude-dir=una-tantum --exclude-dir=rollback \
'insert[[:space:]]+into[[:space:]]+auth\.ruoli([[:space:]]|\(|$)' \
$dirs 2>/dev/null \
| awk -F: '{ riga=$0; sub(/^[^:]*:[^:]*:/, "", riga); gsub(/^[[:space:]]+/, "", riga); if (riga !~ /^--/) print }' || true)
if [ -n "$hits" ]; then
echo "::error::Questo repository dichiara ruoli in auth.ruoli, che appartiene a node-user-profiling."
echo ""
echo "$hits"
echo ""
echo "Cosa fare invece: dichiarare un GRUPPO d'area con i permessi del modulo."
echo " INSERT INTO auth.gruppi (nome, nomecompleto, descrizione, tipogruppo, idruololivello)"
echo " ... poi INSERT INTO auth.gruppipermessi per collegarvi i propri permessi."
echo ""
echo "Il livello che accompagna il gruppo si sceglie fra i tredici di piattaforma"
echo "(manager, contabile, auditor, cfo, dipendente, viewer, operatore, cliente):"
echo "sono gli unici ad avere un ruolo PostgreSQL, senza il quale il SET ROLE fallisce."
echo "Esempio: vue-timesheet/migrations/12_gruppi_area.sql"
exit 1
fi
echo "Nessun INSERT INTO auth.ruoli: contratto rispettato."
- name: Check outdated packages
run: npm outdated || true
- name: Install dependencies
run: npm ci
- name: Security audit
run: npm audit --audit-level=high || true
- name: Lint
run: npm run lint:check
- name: Type check
run: npm run typecheck
- name: Format check
run: npm run format:check
- name: Build
run: npm run build
- name: Test
run: npm run test