Nagadeepak1998/ci-cd-release-risk-scanner

GitHub: Nagadeepak1998/ci-cd-release-risk-scanner

该项目是一个 CI/CD 发布风险扫描器,通过将多维度部署证据转化为确定性风险评分和门禁决策,帮助团队在生产部署前拦截带有潜在风险的发布。

Stars: 0 | Forks: 0

# ci-cd-release-risk-scanner 这是一个面向生产环境的 DevOps 和平台工程项目,用于在部署进入生产环境之前评估发布风险。 该扫描器将具体的 CI/CD 证据转化为发布决策:包括来自变更文件、测试失败、覆盖率差异、依赖项更新、近期事故、回滚历史、变更规模、审批、回滚计划、监控仪表板和金丝雀部署状态的部署前风险,以及来自错误预算消耗率、错误率、延迟、告警、拨测和回滚事件的部署后证据。软件供应链门禁还会检查 SBOM、来源证明、制品签名、漏洞和被禁止的开源许可证。变更咨询门禁会在生产变更开始前,审查冻结窗口、CAB 审批、回滚演练、利益相关者通知、支持覆盖范围、运维手册和可观测性。它以 Python CLI 和 FastAPI 服务的形式发布,并提供 Prometheus 指标、Docker 打包、Kubernetes manifests、Terraform 脚手架、测试、示例报告以及易于阅读的文档。 ## 问题背景 团队在部署时往往缺乏完整的上下文。一个发布表面上可能一切正常(绿灯),但仍然带有来自迁移文件、依赖项更新、生产环境配置更改、近期事故或缺少审批的风险。该项目创建了一个确定性门禁,帮助决定是批准、需要人工审查还是阻止发布。 ## 架构 ``` flowchart LR A[Release context JSON] --> B[Risk scanner engine] B --> C[Rule findings] B --> D[Risk score] D --> E[approve/manual_review/block] C --> F[CLI JSON or Markdown report] B --> L[Deployment readiness checks] L --> F E --> F B --> G[FastAPI /scan] A --> M[Post-deploy evidence JSON] M --> N[Evidence evaluator] N --> O[promote/watch/rollback] O --> F N --> P[FastAPI /evidence] G --> H[Prometheus /metrics] P --> H A --> Q[Supply-chain evidence] Q --> R[SBOM/provenance/signature policy] R --> F R --> S[FastAPI /supply-chain] S --> H A --> T[Change advisory evidence] T --> U[Freeze/CAB/support coverage gate] U --> F U --> V[FastAPI /change-advisory] V --> H G --> I[Docker image] I --> J[Kubernetes manifests] I --> K[AWS ECR and CloudWatch Terraform skeleton] ``` ## 展示内容 - CI/CD 发布门禁设计 - 适用于 CI 的确定性风险评分 - 通过共享的扫描器实现 FastAPI 和 CLI 的一致性 - 针对回滚、监控和金丝雀证据的部署就绪度评分 - 包含 promote、watch 和 rollback 决策的部署后发布证据审查 - 针对 SBOM、来源证明、签名、漏洞和许可证的软件供应链策略 - 针对冻结窗口、CAB 审批、支持覆盖范围和回滚演练的变更咨询审查 - Prometheus 计数器、仪表盘和延迟直方图 - Docker、Kubernetes、Terraform 和 GitHub Actions 模板覆盖 - 围绕生产环境审批、迁移和回滚风险的实用 DevOps 判断能力 ## 本地设置 ``` make setup ``` ## 运行检查 ``` make lint make test ``` ## 生成示例报告 ``` make sample make sample-markdown make sample-evidence make sample-supply-chain make sample-change-advisory ``` 具有风险的样本会以退出代码 `2` 退出,因为它正确地阻止了发布。Makefile 将此视为门禁生效的预期证明。 直接的 CLI 用法: ``` PYTHONPATH=src python -m release_risk_scanner.cli tests/fixtures/risky_release.json \ --output reports/risky-release.json PYTHONPATH=src python -m release_risk_scanner.cli tests/fixtures/risky_release.json \ --format markdown \ --output reports/risky-release.md ``` 报告包含一个 `readiness_checks` 部分,以便审查者可以在部署前确认回滚计划、监控仪表板和金丝雀发布状态是否已准备就绪。 部署后证据模式: ``` PYTHONPATH=src python -m release_risk_scanner.cli \ --evidence tests/fixtures/healthy_evidence.json \ --output reports/healthy-evidence.json PYTHONPATH=src python -m release_risk_scanner.cli \ --evidence tests/fixtures/rollback_evidence.json \ --format markdown \ --output reports/rollback-evidence.md \ --fail-on rollback ``` 健康的证据样本返回 `promote`;回滚证据样本返回 `rollback`,并且当使用 `--fail-on rollback` 时以退出代码 `2` 退出。 供应链证据模式: ``` PYTHONPATH=src python -m release_risk_scanner.cli \ --supply-chain tests/fixtures/supply_chain_blocked.json \ --format markdown \ --output reports/supply-chain-blocked.md ``` 被阻止的制品测试用例证明了发布门禁会拒绝未经验证的签名、缺失的来源证明、严重/高危漏洞以及被禁止的许可证。 变更咨询模式: ``` PYTHONPATH=src python -m release_risk_scanner.cli \ --change-advisory tests/fixtures/change_advisory_blocked.json \ --format markdown \ --output reports/change-advisory-blocked.md ``` 被阻止的咨询测试用例证明了门禁会拒绝在没有紧急审批、CAB 审批、回滚演练、利益相关者通知、支持覆盖范围、运维手册或可观测性证据的情况下进入冻结窗口的发布。 ## 运行 API ``` make run ``` 健康检查: ``` curl http://localhost:8080/health ``` 扫描: ``` curl -X POST http://localhost:8080/scan \ -H "Content-Type: application/json" \ --data @tests/fixtures/risky_release.json ``` 证据审查: ``` curl -X POST http://localhost:8080/evidence \ -H "Content-Type: application/json" \ --data @tests/fixtures/rollback_evidence.json ``` 供应链审查: ``` curl -X POST http://localhost:8080/supply-chain \ -H "Content-Type: application/json" \ --data @tests/fixtures/supply_chain_blocked.json ``` 变更咨询审查: ``` curl -X POST http://localhost:8080/change-advisory \ -H "Content-Type: application/json" \ --data @tests/fixtures/change_advisory_blocked.json ``` 指标: ``` curl http://localhost:8080/metrics ``` ## Docker ``` make docker-build docker run --rm -p 8080:8080 ci-cd-release-risk-scanner:local ``` Docker Compose: ``` docker compose up --build ``` ## Kubernetes ``` kubectl apply -k infra/k8s kubectl rollout status deployment/release-risk-scanner kubectl port-forward service/release-risk-scanner 8080:80 ``` manifests 包含探针、资源限制、Prometheus 抓取注解以及非 root 容器安全上下文。 ## Terraform `infra/terraform` 包含一个用于 ECR 和 CloudWatch logs 的小型 AWS 部署骨架。 ``` cd infra/terraform cp terraform.tfvars.example terraform.tfvars terraform init terraform plan ``` 本地开发不需要云凭据。 ## CI/CD GitHub Actions 模板存放在 `docs/github-actions/ci.yml` 中,因为当前的本地 GitHub token 不具有 `workflow` 权限范围。刷新 token 后,请将其复制到 `.github/workflows/ci.yml`: ``` gh auth refresh -h github.com -s workflow ``` ## 局限性 - 评分引擎是确定性的且有意设计为可解释的;它并不与 GitHub Actions、Jenkins、Jira、PagerDuty 或 Datadog 建立实时连接。 - 供应链输入是标准化后的扫描器证据;该项目不会直接调用 Syft、Grype、Trivy、Cosign 或透明度日志。 - Terraform 只是用于展示可部署性的骨架,而不是完整的生产环境。 - 在用于生产环境之前,应根据实际组织的情况调整示例规则。
标签:ECS, Python, Terraform, 子域名突变, 持续集成与持续交付, 无后门, 自定义请求头, 请求拦截, 软件供应链, 逆向工具