Files
root 24a4067bc8
quality / python-lint (push) Skipped
quality / node-lint (push) Skipped
quality / php-lint (push) Skipped
quality / secret-scan (push) Successful in 6s
quality / actionlint (push) Successful in 5s
quality / vuln-scan (push) Successful in 16s
quality / sast (push) Successful in 29s
selftest / quality (push) Successful in 35s
docs: Fingerprint-Format in .betterleaksignore (ohne Commit empfohlen)
2026-09-11 10:35:20 +00:00

61 lines
3.0 KiB
Markdown

# ci-templates — org-weites Quality-Gate
Reusable Workflow fuer alle Orgs. Scans (betterleaks/semgrep/trivy/actionlint) laufen per
**Default**; Sprach-Linter (python/node/php) sind **opt-in**. **Report-only** per Default,
`blocking: true` macht SAST/Vuln/Lint zum harten Gate. **Secrets (betterleaks) sind IMMER hart.**
## Secret-Scan: betterleaks statt gitleaks (seit 2026-09-11)
gitleaks ist **feature-frozen** (letztes Release 03/2026, nur noch Security-Patches);
die Maintainer inkl. Original-Autor entwickeln **betterleaks** weiter (v1.8.1, MIT,
aktive Releases). betterleaks findet in denselben Repos deutlich mehr als gitleaks
(Bsp.: 34 -> 58 Treffer), kann Secrets per `validate` auf "noch aktiv?" pruefen und
filtert Rauschen per Expr-Regeln.
Zentrale Richtlinie liegt inline im Job `secret-scan` (`[extend] useDefault = true`
+ `[allowlist]`): Beispiel-Dateien (`.env.example`, `*.sample`, `*.template`),
Uebersetzungen (`i18n/*.json`), Abhaengigkeiten/Build (`node_modules`, `vendor`,
`dist`, Lockfiles) und Fixtures werden nicht gemeldet. **Nicht** ausgeschlossen:
`.env`/`.env.prod`, `docker-compose*`, Code und echte Config-Dateien - dort laesst
ein Fund den Gate fehlschlagen.
Pro Repo:
- `.betterleaks.toml` im Repo-Root **ersetzt** die zentrale Richtlinie (Vorrang).
- `.betterleaksignore` im Repo-Root nimmt einzeln akzeptierte Altlasten auf.
Format `<pfad>:<regel>:<zeile>` (empfohlen — greift auch nach neuen Commits) oder
der volle `Fingerprint` aus dem JSON-Report `<commit>:<pfad>:<regel>:<zeile>`.
Fingerprints lokal per `betterleaks git . --report-format json --report-path r.json`.
- Inline-Ausnahme direkt im Code: Kommentar `betterleaks:allow` in der Zeile.
## WICHTIG — Sichtbarkeit (Gitea-Limitation, verifiziert 2026-08-25)
Private reusable Workflows koennen von anderen Repos NICHT gelesen werden
("no permission to read reusable workflow"). Zwei Adoptions-Modi:
### A) ci-templates PUBLIC (empfohlen fuer org-weit)
Pro Repo `.gitea/workflows/quality.yml`:
```yaml
name: quality
on: [push, pull_request]
jobs:
quality:
uses: digiflo/ci-templates/.gitea/workflows/quality.yml@main
with:
python: true # node: true / php: true je nach Repo
# blocking: true # spaeter: hartes Gate
```
### B) ci-templates PRIVAT -> lokale Kopie pro Repo
Komplette `quality.yml` ins Ziel-Repo kopieren, lokal referenzieren
(`uses: ./.gitea/workflows/quality.yml`). Nachteil: Updates muessen nachgezogen werden.
## Inputs
| Input | Default | Wirkung |
|-------|---------|---------|
| skip_secret_scan / skip_sast / skip_vuln | false | Scan abschalten |
| python / node / php | false | Sprach-Linter aktivieren |
| blocking | false | SAST/Vuln/Lint hart (Secrets immer hart) |
## Constraints
- Runner `ct117-docker` (catthehacker, Debian/PEP668): pip mit `--break-system-packages`.
- **KEINE** neuen Docker-Hub-Images im Job (unauth Pull-Limit) -> Tools via GitHub-Release/pip.
- Fuer harte Gates zusaetzlich Branch-Protection (Required status checks) auf `main` setzen.