Some checks failed
Go Benchmark / Performance Regression Check (push) Has been cancelled
Cerberus Integration / Cerberus Security Stack Integration (push) Has been cancelled
Upload Coverage to Codecov / Backend Codecov Upload (push) Has been cancelled
Upload Coverage to Codecov / Frontend Codecov Upload (push) Has been cancelled
CodeQL - Analyze / CodeQL analysis (go) (push) Has been cancelled
CodeQL - Analyze / CodeQL analysis (javascript-typescript) (push) Has been cancelled
CrowdSec Integration / CrowdSec Bouncer Integration (push) Has been cancelled
Docker Build, Publish & Test / build-and-push (push) Has been cancelled
Quality Checks / Auth Route Protection Contract (push) Has been cancelled
Quality Checks / Codecov Trigger/Comment Parity Guard (push) Has been cancelled
Quality Checks / Backend (Go) (push) Has been cancelled
Quality Checks / Frontend (React) (push) Has been cancelled
Rate Limit integration / Rate Limiting Integration (push) Has been cancelled
Security Scan (PR) / Trivy Binary Scan (push) Has been cancelled
Supply Chain Verification (PR) / Verify Supply Chain (push) Has been cancelled
WAF integration / Coraza WAF Integration (push) Has been cancelled
Docker Build, Publish & Test / Security Scan PR Image (push) Has been cancelled
3.7 KiB
Executable File
3.7 KiB
Executable File
CI Sequencing Audit
Date: 2026-02-08
Scope
Audit target: .github/workflows/ci-pipeline.yml
Focus areas:
- YAML syntax validity
- Job
ifcondition patterns fore2e,coverage-*, andsecurity-* - Job dependency sequencing (Lint -> Build -> Integration -> Gate -> E2E/Rest)
- Fork behavior (integration skipped, E2E still runs)
Results
YAML syntax
- Visual inspection indicates valid YAML structure and indentation.
- No duplicate keys or malformed mappings detected.
if condition pattern review
The following jobs implement always() and use a success || skipped guard on the integration gate:
e2e:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped', andneeds.build-image.result == 'success'.e2e-gate:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped'.coverage-backend:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped'.coverage-frontend:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped'.coverage-gate:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped'.codecov-upload:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped'.codecov-gate:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped'andneeds.codecov-upload.result != 'skipped'.security-codeql:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped'.security-trivy:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped', andneeds.build-image.result == 'success'.security-supply-chain:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped', andneeds.build-image.result == 'success'.security-gate:always()plusneeds.integration-gate.result == 'success' || ... == 'skipped'.
Sequencing (Lint -> Build -> Integration -> Gate -> E2E/Rest)
build-imagedepends onlint, establishing Lint -> Build.- Integration jobs depend on
build-image. integration-gatedepends onbuild-imageand all integration jobs.e2edepends onbuild-imageandintegration-gate.- Coverage and security jobs depend on
integration-gate(but not directly onbuild-image). pipeline-gatedepends on all gates.
Fork logic (Integration Skip -> E2E Run)
- Fork PRs set
push_image=false, which makesrun_integration=false. - Integration jobs and
integration-gateare skipped. e2estill runs because it allowsintegration-gateto beskippedand only requiresbuild-imageto succeed.
Findings
IMPORTANT: Coverage and security jobs can run after a skipped integration gate caused by failed build
If lint or build-image fail, integration-gate is skipped. The coverage and security jobs only check (needs.integration-gate.result == 'success' || ... == 'skipped'), so they can run even when the build failed. This weakens the strict sequence guarantee (Lint -> Build -> Integration -> Gate -> E2E/Rest) for these jobs.
Suggested fix:
- Add
needs.build-image.result == 'success'tocoverage-*,coverage-gate,codecov-*, andsecurity-codeqlconditions, or requireneeds.build-image.result == 'success'at theintegration-gatelevel and check forsuccess(notskipped) where strict sequencing is required.
Conclusion
- YAML syntax appears valid on inspection.
always() && (success || skipped)pattern is applied consistently for the targeted jobs.- Fork logic correctly skips integration and still runs E2E.
- Sequencing is mostly correct, with the exception noted for coverage and security jobs when the integration gate is skipped due to an upstream failure.