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

67 lines
3.0 KiB
Markdown

# 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
```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.