Files
platform-templates/pipelines/archetype-static-site
devops a3c022c024 docs: READMEs completos, estructura final de arquetipos
Mueve los reusable workflows a .gitea/workflows/ (restriccion real de
Gitea: workflow_call no puede vivir en una ruta arbitraria, confirmado
en vivo). Corrige todos los 'uses:' cross-repo a URL absoluta
(https://gitea.cruzcloud.net/...) -- la forma corta de GitHub se
resuelve contra github.com en esta instancia, confirmado en vivo con un
test real (reusable workflow + composite action ejecutando gitleaks de
punta a punta). Limpia los archivos de prueba.
2026-08-17 00:23:24 -05:00
..

Arquetipo: sitio estático (nginx)

Cuándo usar este arquetipo: un sitio generado a HTML estático (MkDocs, Hugo, Astro, un build de Vite sin backend) servido por nginx, sin runtime de aplicación. Si tu app necesita ejecutar código en cada request, no es este arquetipo.

Qué asume de tu repo:

  • Un Dockerfile en app_dir basado en (o compatible con) dockerfiles/static-nginx.Dockerfile.
  • cosign.pub commiteado en app_dir.
  • Un manifiesto K8s (manifest_file, el Deployment) con la imagen a actualizar tras cada build.

Diferencia real con los otros 2 arquetipos: Gitleaks y Trivy IaC escanean todo app_dir (no un único archivo) — un sitio estático suele tener varios manifiestos K8s por separado (deployment/service/ingress) en vez de uno solo con todo adentro.

Dónde vive el archivo real

Misma restricción de Gitea que los otros 2 arquetipos (ver pipelines/archetype-nextjs-frontend/README.md para el detalle completo). Archivo real:

.gitea/workflows/archetype-static-site.yaml

Cómo usarlo desde tu repo

jobs:
  build:
    uses: https://gitea.cruzcloud.net/devops/platform-templates/.gitea/workflows/archetype-static-site.yaml@main
    with:
      app_dir: sitio
      image_name: gitea.cruzcloud.net/devops/mi-sitio
      manifest_file: workloads/mi-sitio/deployment.yaml
    secrets:
      REGISTRY_USER: ${{ secrets.REGISTRY_USER }}
      REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
      COSIGN_PRIVATE_KEY: ${{ secrets.COSIGN_PRIVATE_KEY }}
      COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}

Mismas advertencias sobre uses: con URL absoluta y @main vs tag/commit — ver el README del arquetipo de Next.js.

Semgrep: por qué este ruleset

p/python,p/security-audit — asume MkDocs (Python). Si tu generador es Hugo/Astro (Go/JS), este ruleset no aplica realmente — ajustalo al lenguaje real de tu build (o quitá el step si tu sitio no tiene ningún código ejecutable propio, solo contenido).

docs-portal real todavía no usa nginx no-root

dockerfiles/static-nginx.Dockerfile corre nginx sin privilegios (nginxinc/nginx-unprivileged) — mejora encontrada al armar este template. El docs-portal real del lab todavía corre nginx:1.27-alpine estándar (root), es un gap real, pendiente de aplicar por separado (no forma parte de la migración de manifiestos de esta tarea — cambiar la imagen es un cambio de app aparte).