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.
3.0 KiB
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.