Vai al contenuto

CI/CD — GitHub Actions

La pubblicazione delle immagini è attiva — i quality gate no

Ogni servizio backend ha già una pipeline GitHub Actions funzionante che builda e pubblica un'immagine Docker su GHCR a ogni push su main. Nessuna di queste pipeline esegue lint, type-check o test — al momento non esiste alcun quality gate in CI. Devi eseguire i controlli sotto in locale prima di ogni push.

# Backend (nella directory di ogni servizio modificato)
ruff check app tests
python -m mypy app --strict
pytest tests/ -v

# Frontend
cd jinbocho-fe
npm run typecheck && npm run test

Pubblicazione delle immagini (tutti i servizi backend)

Ogni repository di servizio backend — jinbocho-auth-v1, jinbocho-catalog-v1, jinbocho-api-gateway-v1 — ha un identico .github/workflows/publish-image.yml. Builda l'immagine Docker del servizio e la pubblica sul GitHub Container Registry (GHCR), così il docker-compose.community.yml del repo infrastruttura può scaricare immagini già costruite invece di buildare dal sorgente (self-host con un solo comando).

Trigger: push su main, push di un tag che corrisponde a v*, oppure workflow_dispatch manuale.

# .github/workflows/publish-image.yml (identico in auth-v1, catalog-v1, api-gateway-v1)
name: Publish image

on:
  push:
    branches: [main]
    tags: ["v*"]
  workflow_dispatch:

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3

      - name: Log in to GHCR
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Docker metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ghcr.io/${{ github.repository }}
          tags: |
            type=raw,value=latest,enable={{is_default_branch}}
            type=ref,event=tag
            type=sha,format=short

      - name: Build and push
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

Questo job non ha alcuno step di lint, type-check o test — builda e pubblica solo l'immagine. Un commit rotto o non testato su main verrà pubblicato su GHCR come latest.

Immagini risultanti: ghcr.io/<org>/<repo>:latest, ghcr.io/<org>/<repo>:<tag> (quando si pusha un tag v*), e ghcr.io/<org>/<repo>:sha-<short-sha> a ogni build.

Backup del database (repo infrastruttura)

jinbocho-infrastructure-community-v1/.github/workflows/db-backup.yml viene eseguito ogni giorno (cron: "0 2 * * *", 02:00 UTC) oppure manualmente via workflow_dispatch. Esegue il dump di auth_db e catalog_db ospitati su Neon con pg_dump, comprime ogni dump con gzip e li carica come artifact della build con una retention di 90 giorni.

Secret di repository richiesti:

Secret Formato
NEON_AUTH_DB_URL postgresql://user:pass@ep-xxx.neon.tech/auth_db?sslmode=require
NEON_CATALOG_DB_URL postgresql://user:pass@ep-xxx.neon.tech/catalog_db?sslmode=require

Usa la connection string Neon originale (postgresql://), non quella trasformata per asyncpg usata dai servizi a runtime.

Ripristinare un backup:

# 1. Scarica l'artifact da GitHub → Actions → la run → Artifacts
gunzip auth_db_YYYYMMDD_HHMM.sql.gz
psql "$NEON_AUTH_DB_URL" < auth_db_YYYYMMDD_HHMM.sql
# (lo stesso per catalog_db)

Risveglio dei servizi Render

jinbocho-infrastructure-community-v1/.github/workflows/wake-render.yml esegue il ping di tutti i servizi ospitati su Render (frontend, api-gateway, auth-service, catalog-service /health) in parallelo e attende fino a 90 secondi che ciascuno risponda con HTTP 200 — utile per "scaldare" i servizi Render del piano gratuito dopo un cold start.

Questo workflow ha solo un trigger workflow_dispatchnon viene eseguito automaticamente in base a uno schedule. Per risvegliare i servizi automaticamente prima che siano necessari, va invocato esternamente (ad es. un servizio cron esterno che chiama l'API "dispatch workflow" di GitHub Actions) — vedi Risoluzione dei problemi per la configurazione raccomandata.

Pratiche raccomandate (non ancora applicate)

Quanto segue sono default sensati per questo repository, ma al momento nulla in CI li applica — non esiste oggi alcun controllo di stato obbligatorio, dato che publish-image.yml non ha un job di qualità.

Protezione del branch (GitHub → Impostazioni Repository → Branch → regola per main):

Regola Impostazione
Richiedi revisioni delle pull request ✅ Abilita (almeno 1 revisione)
Blocca i force push ✅ Abilita
Consenti eliminazioni ✅ Disabilita

Se in futuro aggiungi un workflow di qualità (lint/type-check/test), rendi il suo job un controllo di stato obbligatorio qui.

Tagging: publish-image.yml si attiva su qualsiasi tag che corrisponde a v* (es. v0.2.0) e pubblica quel tag come tag dell'immagine GHCR — non usa un pattern namespaced <servizio>/v<semver>, poiché ogni servizio vive già nel proprio repository.

git tag v0.2.0
git push --tags

Esecuzione dei controlli di qualità in locale

Poiché la CI non vincola i merge a lint/type-check/test, esegui la suite di qualità completa prima di ogni push:

Servizio backend:

cd jinbocho-auth-v1   # o qualsiasi servizio
source .venv/bin/activate
ruff check app tests
python -m mypy app --strict
pytest tests/ -v

Frontend:

cd jinbocho-fe
npm run typecheck && npm run test && npm run build