Files
platform-templates/devsecops-snippets
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
..

DevSecOps snippets — composite actions

Cada subcarpeta es un composite action real de Gitea Actions (action.yml), no un fragmento de YAML para copiar/pegar — se invocan con uses: como cualquier action de GitHub.

Nota sobre la estructura: el pedido original de este repo era una lista plana (gitleaks-step.yaml, trivy-image-step.yaml, etc.). Se ajustó a <nombre>/action.yml porque es el único layout que Gitea (y GitHub) reconocen como composite action invocable — un archivo con nombre libre no se puede referenciar con uses:, tiene que ser literalmente action.yml (o action.yaml) en su propia carpeta.

Cómo invocar uno desde tu pipeline

steps:
  - uses: https://gitea.cruzcloud.net/devops/platform-templates/devsecops-snippets/gitleaks-step@main
    with:
      source: mi-app/

La URL absoluta (https://gitea.cruzcloud.net/...) no es opcional. La forma corta de GitHub (devops/platform-templates/...@main) se resuelve contra github.com por default en esta instancia de Gitea (DEFAULT_ACTIONS_URL sin configurar = github), no contra el propio Gitea — confirmado en vivo armando este repo: con la forma corta, el runner intentó clonar https://github.com/devops/platform-templates (no existe) y falló con "Repository not found". Con la URL absoluta https://gitea.cruzcloud.net/... sí resuelve correctamente contra la instancia local. Ver ../pipelines/archetype-nextjs-frontend/README.md para más contexto.

Los 6 snippets

Snippet Qué hace Bloquea por default
gitleaks-step Secretos commiteados en el árbol de archivos Sí
trivy-iac-step Misconfiguraciones en manifiestos K8s No (auditoría)
trivy-image-step CVEs de la imagen construida CRITICAL sí, HIGH no
semgrep-step SAST, ruleset configurable por with.configs No (auditoría)
syft-sbom-step Genera y publica el SBOM de la imagen N/A (no bloquea)
cosign-sign-verify-step Firma por digest + smoke test de verificación Sí (firma inválida = falla)

Cada action.yml tiene sus inputs: documentados inline — no hay READMEs individuales por snippet, son chicos y el propio archivo ya explica cada input.

cosign-sign-verify-step: un composite action no puede leer secrets

Restricción real de Gitea/GitHub Actions, no de este repo: un composite action no tiene acceso directo al contexto secrets del caller. El workflow que lo invoca tiene que pasarlos explícitos como with::

- uses: https://gitea.cruzcloud.net/devops/platform-templates/devsecops-snippets/cosign-sign-verify-step@main
  with:
    image_name: ${{ env.IMAGE_NAME }}
    digest: ${{ steps.push.outputs.digest }}
    public_key_path: ${{ env.APP_DIR }}/cosign.pub
    cosign_private_key: ${{ secrets.COSIGN_PRIVATE_KEY }}
    cosign_password: ${{ secrets.COSIGN_PASSWORD }}

Los 3 arquetipos de pipelines/ ya lo hacen así — es solo relevante si armás tu propio pipeline a mano usando estos snippets sueltos.