本文基于CANN开源社区的infrastructure仓库进行技术解读
前言
一个活跃的开源社区,除了核心代码仓库,还需要完善的基础设施来支撑日常运作。文档中心、CI/CD流水线、自动化测试、代码规范检查......这些看似不起眼的东西,却是社区健康运转的基石。
CANN的infrastructure仓库就是扮演这个角色的。它提供了CANN社区运行所需的各种基础设施配置和工具。
什么是infrastructure
infrastructure(基础设施)是CANN开源社区的基础设施仓库,包含:
- CI/CD配置
- 代码规范检查
- 文档构建系统
- 自动化测试框架
- 开发者工具
简单说,就是让CANN社区能够高效协作的"工具箱"。
核心组件
1. CI/CD系统
自动化的持续集成和持续部署:
# GitHub Actions配置示例
name: CANN CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build CANN
run: |
./scripts/build.sh
- name: Run Tests
run: |
./scripts/test.sh
2. 代码规范检查
保证代码质量:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/psf/black
rev: 23.1.0
hooks:
- id: black
- repo: https://github.com/pycqa/isort
rev: 5.12.0
hooks:
- id: isort
- repo: https://github.com/PyCQA/flake8
rev: 6.0.0
hooks:
- id: flake8
3. 文档构建系统
自动生成和部署文档:
# mkdocs.yml
site_name: CANN Documentation
site_url: https://docs.atomgit.com/cann/
nav:
- Home: index.md
- Getting Started:
- Installation: installation.md
- Quick Start: quickstart.md
- API Reference:
- ops-nn: api/ops-nn.md
- ops-cv: api/ops-cv.md
plugins:
- search
- git-revision-date-localized
4. 自动化测试
完整的测试框架:
# pytest配置
[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = "-v --tb=short --cov=. --cov-report=html"
项目结构
infrastructure/
├── .github/
│ ├── workflows/ # GitHub Actions工作流
│ │ ├── ci.yml
│ │ ├── cd.yml
│ │ └── security.yml
│ ├── ISSUE_TEMPLATE/ # Issue模板
│ └── PULL_REQUEST_TEMPLATE.md
├── .pre-commit-config.yaml # 代码规范检查
├── .markdownlint.json # Markdown规范
├── .editorconfig # 编辑器配置
├── docs/
│ ├── mkdocs.yml # 文档配置
│ ├── requirements.txt # 文档依赖
│ └── source/ # 文档源文件
├── scripts/
│ ├── build.sh # 构建脚本
│ ├── test.sh # 测试脚本
│ ├── lint.sh # 代码检查脚本
│ └── release.sh # 发布脚本
├── templates/
│ ├── issue_template.md # Issue模板
│ └── pr_template.md # PR模板
└── tools/
├── setup.sh # 环境设置
├── format.sh # 代码格式化
└── check.sh # 代码检查
主要功能
1. 自动化构建
支持多种构建场景:
# 构建CANN所有组件
./scripts/build.sh --all
# 只构建指定组件
./scripts/build.sh --component ops-nn
# 构建并运行测试
./scripts/build.sh --test
# 交叉编译(用于ARM平台)
./scripts/build.sh --target arm64
2. 自动化测试
完整的测试套件:
# 运行所有测试
./scripts/test.sh --all
# 运行单元测试
./scripts/test.sh --unit
# 运行集成测试
./scripts/test.sh --integration
# 运行性能测试
./scripts/test.sh --benchmark
# 生成覆盖率报告
./scripts/test.sh --coverage
3. 代码质量检查
多维度代码检查:
# 格式检查
./scripts/lint.sh --format
# 静态分析
./scripts/lint.sh --static
# 安全检查
./scripts/lint.sh --security
# 运行所有检查
./scripts/lint.sh --all
4. 文档生成
自动构建和部署文档:
# 本地预览文档
cd docs
mkdocs serve
# 构建文档
mkdocs build
# 部署到文档站点
mkdocs gh-deploy
开发者工具
1. 环境设置
快速搭建开发环境:
# 自动安装所有依赖
./tools/setup.sh
# 安装开发工具
./tools/setup.sh --dev-tools
# 安装测试依赖
./tools/setup.sh --test-deps
2. 代码格式化
自动格式化代码:
# 格式化所有代码
./tools/format.sh --all
# 只格式化改动的文件
./tools/format.sh --changed
# 格式化指定目录
./tools/format.sh --dir src/ops-nn
3. 发布流程
标准化的发布流程:
# 创建发布分支
./scripts/release.sh --create v1.0.0
# 生成变更日志
./scripts/release.sh --changelog v1.0.0
# 打包发布
./scripts/release.sh --package v1.0.0
最佳实践
1. 提交信息规范
使用Conventional Commits格式:
feat: 添加新的Attention算子
fix: 修复LayerNorm的数值精度问题
docs: 更新API文档
test: 添加单元测试
chore: 更新依赖版本
2. PR模板
使用标准化的PR模板:
## 变更类型
- [ ] 新功能
- [ ] Bug修复
- [ ] 文档更新
- [ ] 性能优化
## 变更说明
请描述这次PR的具体变更内容...
## 测试
- [ ] 添加了单元测试
- [ ] 添加了集成测试
- [ ] 手动测试通过
## 相关Issue
Closes #123
3. 代码审查流程
1. 提交PR前先运行本地检查
./tools/check.sh --all
2. 确保所有CI检查通过
3. 至少需要一位maintainer的审查
4. 解决所有review comments
5. 等待合并
CI/CD流程
完整CI/CD工作流
否
是
否
是
是
否
开发者提交代码
触发CI/CD
代码检查
格式检查
静态分析
安全扫描
检查通过?
通知开发者
构建项目
运行测试
测试通过?
生成文档
性能测试
是否合并?
合并到主分支
等待审查
触发CD
发布到包仓库
部署文档
通知所有成员
代码质量检查流程
代码提交
Pre-commit检查
Black格式化
isort排序
flake8检查
CI触发
单元测试
集成测试
覆盖率测试
测试报告
安全扫描
依赖检查
代码审查
集成服务
1. 文档中心
自动部署的文档站点:
- API文档
- 教程和指南
- FAQ
- 示例代码
2. 包管理
自动发布到包仓库:
# 发布到PyPI
./scripts/release.sh --pypi
# 发布到conda-forge
./scripts/release.sh --conda
# 发布到AtomGit包仓库
./scripts/release.sh --atomgit
3. 性能监控
持续的性能监控:
# 运行性能基准测试
./scripts/benchmark.sh
# 生成性能报告
./scripts/benchmark.sh --report
# 与历史版本对比
./scripts/benchmark.sh --compare v0.9.0
安全性
1. 依赖安全扫描
自动检查依赖包的安全漏洞:
# 扫描依赖漏洞
./scripts/security.sh --scan-dependencies
# 生成安全报告
./scripts/security.sh --report
# 自动修复已知漏洞
./scripts/security.sh --fix
2. 代码安全检查
检测代码中的安全隐患:
# 静态安全分析
./scripts/lint.sh --security
# 检查敏感信息泄露
./scripts/security.sh --check-secrets
# 检测SQL注入、XSS等
./scripts/security.sh --vulnerability-scan
3. 访问控制
配置仓库的访问权限:
# 分支保护规则
- main分支:需要PR审查
- develop分支:需要CI通过
- release分支:需要maintainer批准
# 团队权限
- Maintainer:读写所有分支
- Committer:读写feature分支
- Contributor:只读
常见问题
Q1:如何配置CI/CD?
fork仓库后,会在Settings/Actions中看到自动配置的workflow
Q2:本地如何运行代码检查?
执行 ./tools/check.sh --all 即可
Q3:如何贡献文档?
在docs/source目录下添加或修改Markdown文件,提交PR即可
总结
infrastructure是CANN社区的基础设施仓库,主要功能:
- 提供CI/CD自动化
- 统一代码规范
- 自动化测试
- 文档构建和部署
- 开发者工具
虽然不直接包含核心代码,但却是CANN社区能够高效运转的重要支撑。
相关链接
- infrastructure仓库:https://atomgit.com/cann/infrastructure
- CANN组织:https://atomgit.com/cann
- 文档中心:https://docs.atomgit.com/cann
本文基于infrastructure仓库公开信息撰写,如有错误欢迎指正。