# 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 `/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 ```yaml 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:`: ```yaml - 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.