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, 子域名突变, 持续集成与持续交付, 无后门, 自定义请求头, 请求拦截, 软件供应链, 逆向工具