paruff/uFawkesPipe

GitHub: paruff/uFawkesPipe

基于 Woodpecker CI 构建的 DevSecOps 流水线平台,为多语言应用提供标准化的构建、安全扫描与交付能力。

Stars: 0 | Forks: 0

# uFawkesPipe [![CI Pipeline](https://static.pigsec.cn/wp-content/uploads/repos/cas/64/6402ed1b0b38ad5b3164d8eb323822844b5b603e2c640509d02bd7dab3bd23a3.svg)](https://github.com/paruff/uFawkesPipe/actions/workflows/ci-pipeline.yml) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) **Fawkes IDP 家族的集成与交付层** uFawkesPipe 是一个基于 Woodpecker CI 的 CI/CD 平台,集成了 SAST(SonarQube、Trivy、Gitleaks)、Cloud Native Buildpacks 以及 DefectDojo 安全扫描摄取功能 —— 即 Fawkes IDP 的 CI/CD 层。 ## 🚀 功能 - **多语言支持** - 通过 Cloud Native Buildpacks 构建使用 Java、Python、Node.js、Go、Ruby 等语言的应用程序 - **标准流水线契约** - 通过 `.fawkespipe.yml` 配置定义 CI/CD 行为(参见 [docs/pipeline-contract.md](docs/pipeline-contract.md)) - **Cloud Native Buildpacks** - 无需 Dockerfile 即可构建兼容 OCI 的容器镜像 - **安全第一的流水线** - 集成了 Gitleaks 密钥扫描、Trivy 漏洞扫描(文件系统 + 容器)以及 SonarQube SAST - **DefectDojo 集成** - 构建后自动摄取安全扫描结果 - **基于 Woodpecker** - 轻量级、YAML 驱动的 CI/CD 编排,支持 GitHub OAuth - **DORA 可观测性** - 结构化 JSON 日志、OTEL 部署事件发射、Prometheus 指标 - **独立 + 套件模式** - 独立运行或连接至 uFawkesRes(PostgreSQL/Traefik)和 uFawkesObs(OTEL/Loki) ## 📋 流水线阶段 uFawkesPipe 中的每个流水线都遵循以下标准化阶段(定义在 [`.woodpecker.yml`](.woodpecker.yml) 中): | # | 阶段 | 步骤 | 并行 | 分支门控 | |---|-------|-------|----------|-------------| | 1 | **validate (验证)** | `init` → `lint-yaml` + `lint-shell` | 是 (lint) | 无 | | 2 | **test (测试)** | `unit-tests` + `integration-tests` + `contract-tests` | 是 | 无 | | 3 | **security (安全)** | `secrets-scan` → `vuln-scan-fs` → `vuln-scan-image` | 顺序执行 | `vuln-scan-image`: 仅限 main | | 4 | **build (构建)** | `build-image` | — | 仅限 main | | 5 | **publish (发布)** | `upload-defectdojo` | — | 仅限 main | | 6 | **deploy (部署)** | `notify-obs` | — | 仅限 main | **步骤详情:** - **init** — 创建制品目录(security、coverage、tests) - **lint-yaml** — 使用 yamllint 验证 `compose.yaml`、`.woodpecker.yml`、`.env.example` - **lint-shell** — 对 `scripts/*.sh` 和 `validate.sh` 进行 ShellCheck 验证 - **unit-tests** — 快速、隔离的 pytest 单元测试(无外部依赖) - **integration-tests** — 跨组件测试(可能需要 Docker) - **contract-tests** — 流水线契约、compose 和 YAML 验证 - **secrets-scan** — 硬门控:使用 `.gitleaks.toml` 规则和 `.secrets.baseline` 进行 Gitleaks 密钥检测 - **vuln-scan-fs** — Trivy 文件系统漏洞扫描(整个工作区) - **vuln-scan-image** — Trivy 容器镜像漏洞扫描(仅限 main 分支) - **build-image** — 通过 CNB 构建容器镜像(占位符) - **upload-defectdojo** — 收集 Gitleaks + Trivy 结果并 POST 到 DefectDojo API(非阻塞) - **notify-obs** — 向 uFawkesObs OTEL collector 发送结构化部署事件(非阻塞) 所有步骤均通过 `scripts/dora-log.sh` 发送结构化 JSON 日志,与 uFawkesObs/Loki 摄取兼容。 ## 🏗️ 架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ uFawkesPipe Platform │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌────────────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Woodpecker Server │ │ SonarQube │ │ Portainer │ │ │ │ + Agent │ │ (SAST) │ │ CE (CD) │ │ │ │ │ │ │ │ │ │ │ │ - Pipeline YAML │ │ - Quality │ │ - Stacks │ │ │ │ - GitHub OAuth │ │ Gates │ │ - Secrets │ │ │ │ - CLI triggers │ │ - Coverage │ │ - Volumes │ │ │ └────────────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ │ │ │ └──────────────────────────┴────────────────┘ │ │ │ │ │ ┌────────▼────────┐ │ │ │ CNB Builder │ │ │ │ (Buildpacks) │ │ │ └────────┬────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────┐ │ │ │ Docker │ │ │ │ Registry │ │ │ └─────────────────┘ │ │ │ │ Suite mode: ┌────────────┐ ┌───────────────────┐ │ │ │ uFawkesRes │ │ uFawkesObs │ │ │ │ (Postgres, │◄──│ (OTEL, Loki, │ │ │ │ Traefik) │ │ Prometheus) │ │ │ └────────────┘ └───────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` - **独立模式** (`make up`):Woodpecker + SonarQube + Portainer,本地存储 - **套件模式** (`make up-suite`):增加 uFawkesRes PostgreSQL、Valkey、Traefik ingress 以及 uFawkesObs OTEL Collector、Alloy、Loki、Prometheus ## 🛠️ 快速开始 ### 前置条件 - Docker Engine 20.10+ - Docker Compose v2.0+(`docker compose` 插件,而非独立的 `docker-compose`) - 4GB+ 内存可供容器使用 - 用于 Woodpecker 身份验证的 GitHub OAuth App(Client ID + Secret) - DockerHub 账户(用于镜像仓库) ### 设置 1. **克隆仓库** git clone https://github.com/paruff/uFawkesPipe.git cd uFawkesPipe 2. **配置环境** cp .env.example .env # 使用您的凭证和 OAuth 密钥编辑 .env nano .env 3. **启动平台** # 独立模式 (Woodpecker + SonarQube + Portainer) make up # 或套件模式 (连接到 uFawkesRes + uFawkesObs) make up-suite 4. **访问平台** | 服务 | 端口 | URL | 认证方式 | | ------------- | ---- | ---------------------- | -------------------------- | | Woodpecker CI | 8000 | http://localhost:8000 | GitHub OAuth | | Portainer CE | 9443 | https://localhost:9443 | 管理员账户(首次使用) | | SonarQube | 9000 | http://localhost:9000 | admin / (来自 .env) | ### 首次流水线 1. 在您的应用程序仓库中添加 `.fawkespipe.yml`(参见 [docs/pipeline-contract.md](docs/pipeline-contract.md)) 2. 推送到 GitHub 3. 在 Woodpecker UI 中:Repositories → 激活您的仓库 4. 推送代码 → 通过 GitHub webhook 自动触发流水线 完整详情:[QUICKSTART.md](QUICKSTART.md) ## 📖 流水线契约参考 `.fawkespipe.yml` 文件是标准的流水线契约,定义了应用程序如何构建、测试、扫描和部署。它放置在您的应用程序仓库的根目录下。 ### 核心部分 - **`app`** - 应用程序元数据(名称、类型、语言、版本) - **`build`** - 构建配置:`cnb` (Cloud Native Buildpacks)、`docker` 或 `custom` - **`stages`** - 启用/禁用并配置流水线阶段(lint、test、sast、dependency_scan、build、image_scan、push) - **`notifications`** - Slack 和电子邮件通知配置 - **`kubernetes`** - Kubernetes 部署配置(晋升路径) - **`advanced`** - 超时、重试、并行执行、制品保留 ### 特定语言示例 - [Java/Maven](examples/.fawkespipe-java-maven.yml) - [Python/Flask](examples/.fawkespipe-python-flask.yml) - [Node.js/Express](examples/.fawkespipe-nodejs-express.yml) - [Go](examples/.fawkespipe-go.yml) **完整参考:[docs/pipeline-contract.md](docs/pipeline-contract.md)** ## 🔌 Webhook API uFawkesPipe 暴露 Woodpecker CI webhook 以用于外部平面集成。 ### 通过 Webhook 触发流水线 当仓库被激活时,Woodpecker CI 会自动接收来自 GitHub 的 push webhook。webhook URL 由 Woodpecker 在激活仓库期间自动配置。 **GitHub Webhook 集成**: 在 Woodpecker 中激活仓库时会自动配置。该 webhook 指向: - Payload URL: `http://:8000/api/hooks/` - Content type: `application/json` - 事件: Push、Pull Request ### CLI 命令 **Woodpecker CLI** 从命令行触发: ``` # 列出 repositories 和 pipelines woodpecker-cli repo ls woodpecker-cli repo info woodpecker-cli pipeline ls --repo # 触发特定 pipeline woodpecker-cli pipeline start ``` 完整用法请参见 [Woodpecker CLI 文档](https://woodpecker-ci.org/docs/cli)。 ## ☸️ Kubernetes 晋升路径 uFawkesPipe 专为使用 Docker Compose 的单节点开发而设计。针对 Woodpecker 技术栈的 Kubernetes 部署支持已在计划中,但尚未实现。 有关计划中的配置 schema,请参阅流水线契约中的 [`kubernetes` 部分](docs/pipeline-contract.md#kubernetes---kubernetes-deployment)。 ## 🔒 安全特性 ### 密钥检测 - **Gitleaks** — 硬门控:在每次提交/推送时扫描所有文件以查找密钥、API key 和凭证 - **Pre-commit hook** — 用于已知误报的 detect-secrets 基准(`.secrets.baseline`) - **基准自动更新** — `.secrets.baseline` 在行号更改时自动更新 ### 静态应用程序安全测试 (SAST) - **SonarQube** — 代码质量和安全漏洞分析 - **Trivy** — 文件系统和代码漏洞扫描 ### 依赖扫描 - **Trivy** — 全面的漏洞数据库扫描(文件系统和容器镜像) - **OWASP Dependency-Check** — 已知的易受攻击依赖项(在 `.fawkespipe.yml` 中配置) ### 容器安全 - **Trivy** — 容器镜像漏洞扫描(仅限 main 分支) - **Cloud Native Buildpacks** — 无需 Dockerfile 即可构建 OCI 镜像(减少攻击面) - **镜像锁定** — 所有服务镜像均锁定至特定版本(不使用 `:latest`) ### DefectDojo 集成 - 自动将 Gitleaks 和 Trivy 扫描结果上传至 DefectDojo API - 非阻塞 — 扫描摄取失败不会导致流水线失败 ## 🧪 测试覆盖率 `tests/unit/` 测试套件静态验证 `.woodpecker.yml` 流水线定义 — 它**不会**针对活动的 Woodpecker 实例执行流水线。端到端流水线执行通过 `make up` + Woodpecker UI 进行手动验证。 ### `pytest tests/unit/` 验证的内容 | 测试模块 | 覆盖范围 | |-------------|----------| | `test_woodpecker_yml.py` | **流水线结构**:有效的 YAML、`steps` 列表存在、包含 `when` 部分。**步骤排序**:`init` 在首位、lint 在 security 之前、test 在 security 之前。**步骤配置**(每个步骤):正确的镜像及版本锁定(例如 `alpine:3.20`、`zricethezav/gitleaks:v8.18.2`、`curlimages/curl:8.6.0`)、必需的命令/标志(针对密钥的 `--format json`、`--no-progress`、`--exit-code=1`)、输出路径(`artifacts/security/*.json`)、密钥配置(`from_secret`)、分支条件(`when: branch: main`)、DORA 日志记录(`source dora-log.sh`、`dora_start`、`dora_emit`)、非阻塞行为(失败时 `dora_warn`)。**Trivy 例外**:明确断言扫描镜像使用 `aquasec/trivy:latest` 并附有文档说明理由。**制品目录**:`init` 通过 `mkdir -p` 创建 `artifacts/security`、`artifacts/coverage`、`artifacts/tests`。 | | `test_docker_compose_validation.py` | **Compose 结构**:有效的 YAML、`services` 部分、所有服务都有 `image`、没有 `:latest` 标签、所有服务都有 `labels`、存在卷声明、命名卷(无主机路径)、compose 中无密钥。**健康检查**:服务声明了 `healthcheck`(`dependency-check`、`pack-cli` 除外)。 | | `test_compose_network.py` | **独立模式**:`compose.yaml` 声明无 `fawkes-net`,没有服务附加到它,`woodpecker-agent` 没有 `WOODPECKER_BACKEND_DOCKER_NETWORK`。**套件模式**:`compose.suite.yaml` 将 `fawkes-net` 声明为 `external: true` 及 `name: fawkes-net`,所有 4 个服务都附加,agent 包含 `WOODPECKER_BACKEND_DOCKER_NETWORK=fawkes-net`。**Makefile**:`network` 目标幂等地创建 `fawkes-net`(双管道 true);`up` 无 `network` 依赖;`up-suite` 有 `network` 依赖。 | | `test_artifact_dirs` | **Init 步骤**:第一步是使用 `alpine:3.20` 的 `init`;命令包含使用 `mkdir -p` 的 `mkdir -p artifacts/security`、`artifacts/coverage`、`artifacts/tests`。 | ### 单元测试未涵盖的内容 - ❌ 针对 Woodpecker 服务器的实时流水线执行 - ❌ GitHub webhook 投递 / 仓库激活流程 - ❌ Docker 镜像构建 / CNB buildpack 执行 - ❌ SonarQube 质量门评估 - ❌ DefectDojo API 摄取 - ❌ OTEL collector 事件发射 / Loki 摄取 - ❌ 跨服务集成(Woodpecker ↔ SonarQube ↔ Portainer) - ❌ 性能 / 负载特性 ### 运行测试 ``` # 所有单元测试(快速,无外部 deps) python3 -m pytest tests/unit/ -v # 带 markers(unit, integration, smoke, acceptance) python3 -m pytest tests/ -m unit python3 -m pytest tests/ -m integration python3 -m pytest tests/ -m smoke python3 -m pytest tests/ -m acceptance ``` ## 🔧 配置 ### 流水线配置 CI 流水线定义在 [`.woodpecker.yml`](.woodpecker.yml) 中。自定义它以: - 添加或删除流水线步骤 - 为不同阶段配置环境变量 - 为 registry 身份验证和 API token 定义密钥 ### 流水线契约配置 应用程序团队通过位于其仓库根目录下的 `.fawkespipe.yml` 配置其流水线行为。完整参考请参见 [docs/pipeline-contract.md](docs/pipeline-contract.md)。 ### 服务配置 编辑 [`compose.yaml`](compose.yaml) 以: - 更改暴露端口 - 添加更多服务 - 配置资源限制 - 添加额外网络 ### 卷管理 持久化数据存储在 Docker 卷中: - `woodpecker_data` — Woodpecker CI 数据库和配置 - `portainer_data` — Portainer CD 数据 - `sonarqube_data` — SonarQube 分析数据 - `pack_cache` — CNB 构建缓存 **备份卷:** ``` docker run --rm -v ufp_woodpecker_data:/data -v $(pwd):/backup alpine \ tar czf /backup/woodpecker-backup.tar.gz -C /data . ``` ## 🐛 故障排除 ### Woodpecker 无法启动 ``` # 检查日志 make logs # 检查 Woodpecker 状态 make status # 验证 .env 中的 GitHub OAuth 配置 grep WOODPECKER_GITHUB .env # 重置 Woodpecker 数据 make down docker volume rm ufp_woodpecker_data make up ``` ### 端口 8000(或 9000、9443)已被占用 ``` lsof -i :8000 lsof -i :9000 lsof -i :9443 ``` 如有需要,编辑 `compose.yaml` 更改主机端口映射。 ### SonarQube 无法启动 ``` # 检查日志 make logs sonarqube # 增加 vm.max_map_count(Elasticsearch 必需) sudo sysctl -w vm.max_map_count=262144 # 设为永久 echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf ``` ### GitHub webhook 失败 - 验证 `.env` 中的 `WOODPECKER_HOST` 是否与 webhook 回调 URL 匹配 - 检查 Woodpecker UI → Repositories → 您的仓库 → Settings 中的 webhook 状态 - 确保您的 Woodpecker 实例可以从 GitHub 访问 ### OTEL collector 无法访问(套件模式) ``` # 验证 OTEL endpoint 已设置 grep OTEL_ENDPOINT .env # 检查来自 Woodpecker agent container 的连通性 docker compose -f compose.yaml exec woodpecker-agent wget -qO- http://otel-collector:4318 ``` ### Pack 构建失败 ``` # 检查 Docker 访问权限 docker ps # 验证 builder image docker pull paketobuildpacks/builder:base # 在 Woodpecker CI 构建输出中检查 pack 日志 ``` ### Trivy 扫描缓慢 - 首次运行会下载 CVE 数据库(1-5 分钟) - 后续运行使用缓存数据(更快) - Trivy 镜像扫描仅在 main 分支推送时运行 ## 📚 附加资源 - [Woodpecker CI 文档](https://woodpecker-ci.org/docs/intro) - [Cloud Native Buildpacks](https://buildpacks.io/) - [SonarQube 文档](https://docs.sonarqube.org/) - [Trivy 文档](https://aquasecurity.github.io/trivy/) - [Gitleaks 文档](https://gitleaks.io/) - [DefectDojo 文档](https://docs.defectdojo.com/) - [uFawkesObs — 可观测性平面](https://github.com/paruff/uFawkesObs) ## 📄 许可证 Apache License 2.0 — 详情见 [LICENSE](LICENSE)。 ## 🙋 支持 - GitHub Issues: https://github.com/paruff/uFawkesPipe/issues - 文档: https://github.com/paruff/uFawkesPipe/wiki 专为平台工程师和开发者打造 ## uFawkes 技术栈生态系统 uFawkesPipe 是 [uFawkes](https://ufawkes.dev) 平台工程生态系统的一部分: | 技术栈 | 描述 | 链接 | | --------------- | ---------------------------------------------------- | ----------------------------------------------- | | **uFawkesRes** | 资源平面 — PostgreSQL、Valkey、Traefik、Authelia | [GitHub](https://github.com/paruff/uFawkesRes) | | **uFawkesPipe** | CI/CD — Woodpecker、Buildpacks、DevSecOps | [GitHub](https://github.com/paruff/uFawkesPipe) | | **uFawkesObs** | 可观测性 — Prometheus、Grafana、Loki、OTEL | [GitHub](https://github.com/paruff/uFawkesObs) | | **uFawkesDORA** | DORA 指标 — 仪表盘、VSM、交付性能 | [GitHub](https://github.com/paruff/uFawkesDORA) | | **uFawkesSec** | 安全 — 策略即代码、供应链、护栏 | [GitHub](https://github.com/paruff/uFawkesSec) | | **uFawkesDevX** | 开发者体验 — 黄金路径、IDP 模板 | [GitHub](https://github.com/paruff/uFawkesDevX) | | **uFawkesAI** | AI 智能体模板 — 黄金路径脚手架 | [GitHub](https://github.com/paruff/uFawkesAI) | **产品套件路线图**:[fawkes/ROADMAP.md](https://github.com/paruff/fawkes/blob/main/ROADMAP.md)
标签:DevOps平台, DevSecOps, Woodpecker CI, 上游代理, 测试用例, 用户代理, 自定义请求头, 请求拦截, 逆向工具