Entry
Pull request or push
Every PR and push to default, no path filters
Technical overviewSecurity engineering in CI/CD
Secret, dependency, container and configuration scans that block a merge, each one proved by planting the defect it exists to catch.
Source code
Inspect the implementation, commit history, and project documentation.
01
Four scans run as three jobs on every pull request and push across three public repositories: a committed credential, a vulnerable dependency, a vulnerable container image, or a misconfigured Dockerfile each fail the build before merge. The same gates are ported to GitLab CI on a self-hosted runner, and every one was verified by planting the exact defect it exists to catch.
02
A simulation of the configured gates, not a live pipeline run. Every scanner, threshold and framework below is read from the committed workflow.
Pick what to commit
pull requestmain at 7a14485
Merge allowed
gitleaks read 119 commits and 67.61 MB with no leaks. Checkov passed 148 dockerfile checks with 2 skipped, 148 github_actions and 9 gitlab_ci.
The same three jobs run on GitLab CI against a self-hosted shell runner on g7. Pipeline 2783396207 went green in 209 s, created by the mirror push after a merge rather than by anyone pressing Run.
Entry
Every PR and push to default, no path filters
Checkout
fetch-depth 0, so secrets stay reachable to the scan
Supply chain
Gitleaks, Trivy, and Checkov at named versions
Gate
Gitleaks over the whole history, redacted
Gate
Trivy at HIGH and CRITICAL on pinned manifests
Gate
Production image rebuilt in the job, then scanned
Gate
Checkov on Dockerfiles, manifests, pipelines
Exception record
Each exception names the finding, date, and reason
Ordering
Records both exit codes, fails at the end
Evidence
Every job uploads its report, kept 30 days
Replication
Pushes the branch after each merge
Compute
Tagged shell runner on a home server
Result
Same jobs and thresholds, green in 209s
03
A finding at HIGH or CRITICAL exits non-zero and blocks the merge; clearing it by lowering the threshold would defeat the point.
Every gate got a pull request carrying the exact defect it catches; the config gate first passed an unhardened Dockerfile in a dot-directory and was fixed rather than recorded as a pass.
A key committed before these gates existed stays reachable in public history, so the scan reads the full clone, not the diff.
Rewriting history left matches fetchable under pull-request refs no force-push can reach, so rotating the key at the provider is what actually closed the exposure.
04
$ gitleaks git . --redact --exit-code 1
full history scanned · no leaks
$ trivy filesystem --severity HIGH,CRITICAL
0 findings · 12 dated exceptions
✓ pipeline 2783396207 · source=push · 209s05