FEATURED · 精选文章

理解 DeepChem 的 CI 体系:GitHub Actions 工作流、测试矩阵与依赖管理深度解析

发布时间 / 2026/9/17 8:13:18
来源 / 创域科博编辑部
栏目 / 资讯中心
理解 DeepChem 的 CI 体系:GitHub Actions 工作流、测试矩阵与依赖管理深度解析 理解 DeepChem 的 CI 体系GitHub Actions 工作流、测试矩阵与依赖管理深度解析【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchemDeepChem是一个面向药物发现、量子化学、材料科学与生物学的开源深度学习工具包其代码库同时维护 TensorFlow、PyTorch、JAX 三大深度学习后端并横跨 Linux、Windows、macOS 多种平台。为了保证每一次提交与 Pull RequestPR都不会破坏既有功能DeepChem 借助 GitHub Actions 构建了一套约 35 个 CI 测试任务组成的工作流体系。本文以 docs/source/development_guide/ci.rst 为骨架结合.github/workflows/下真实工作流源码与requirements/目录下的依赖文件逐层拆解 DeepChem CI 的整体设计、矩阵策略、后端测试分工、文档构建、发布流程、依赖管理约定以及编写单元测试时的路径最佳实践帮助你理解如何为这类多后端、跨平台的科学计算项目搭建可靠的质量防线。一、CI 的整体架构与触发时机1.1 CI 要解决的问题CIContinuous Integration持续集成的作用是持续地构建代码并运行测试确保提交引入的改动不会引入错误。DeepChem 的 CI 通过 GitHub Actions 提供的工作流workflow来运行一系列测试任务job。当一个工作流中的所有 CI 测试全部通过时就意味着该提交引入的改动没有破坏现有功能。1.2 触发时机根据 ci.rst 的说明在以下两种情况下会触发 CI向 master 分支创建 PRPull Request时向 master 分支推送push提交时。此时会运行来自下列工作流的约 35 个 CI 测试任务。工作流文件统一存放在 .github/workflows/ 目录下当前仓库实际包含 11 个工作流文件工作流文件职责test.ymlDeepChem Core 单元测试含构建、导入检查、pytest、doctestformatting.yml代码格式与静态检查yapf、flake8、mypyjax_setup.ymlJAX 后端的构建与标记测试tensorflow_setup.ymlTensorFlow 后端的构建与标记测试torch_setup.ymlPyTorch 后端的构建与标记测试docs.yml文档构建与教程/示例 doctestrelease.yml打 tag 时触发的 PyPI 发布与 Docker 镜像推送website_build_dispatch.ymlmaster 推送后触发 deepchem.io 网站重建dqc_install.yml、hf_setup.yml、mini_build.yml辅助性的环境准备与精简构建工作流几乎所有测试工作流都使用统一的on触发条件push到 master 分支以及pull_request到 master 分支见 test.yml 等文件的开头。二、DeepChem Core 测试test.yml 工作流test.yml名称为 Unit Tests负责 DeepChem 核心功能的构建与测试是 CI 体系中任务量最大的工作流对应 ci.rst 中的 Tests for DeepChem Core。2.1 core-build构建与导入检查core-buildjob 通过矩阵策略覆盖多平台、多 Python 版本ubuntu-latest上使用 Python 3.8、3.10、3.11windows-latest上使用 Python 3.9。每个组合执行以下步骤释放构建空间在 ubuntu runner 上先删除.NET、ghc、boost等预装组件并清理 Docker 镜像sudo docker image prune --all --force为编译密集的科学计算依赖腾出磁盘空间checkout 代码使用actions/checkoutv4缓存 pip 模块actions/cachev4以requirements/**.yml的文件哈希作为缓存键加速依赖安装安装 Pythonactions/setup-pythonv5构建 DeepChem先升级 pip然后执行pip install -e .可编辑安装导入检查执行python -c import deepchem验证安装后的包可以被正常导入。这个 job 的核心价值在于用最小代价快速确认 DeepChem 在目标 Python 版本与操作系统上能够完成构建并被import一旦失败即可尽早拦截避免后续耗时测试白跑。2.2 unit-testspytest、doctest 与覆盖率unit-testsjob 使用相同的 OS/Python 矩阵但环境搭建复杂得多通过git fetch与COMMIT_RANGE计算提交范围push 事件对比上一次提交PR 事件对比origin/master用于后续增量检查根据 Python 版本与操作系统用conda-merge工具将多个requirements/*.yml合并为env.ymlPython 3.8 属于特例会排除 JAX因为 JAX 在 Windows 上不受支持并使用env_common_3_8.yml、env_ubuntu.yml、env_dqc.yml等兼容旧版本的依赖组合见 test.ymlPython 3.11 使用env_ubuntu_3_11.yml、env_mac_3_11.yml等新版本环境文件其他 Python 版本≥3.9使用默认的env_common.yml、env_ubuntu.yml在 Linux 上会先通过 apt 安装libopenblas-dev、libatlas-base-dev、libblas-dev、liblapack-dev、libhdf5-dev等底层数值与 HDF5 库使用conda-incubator/setup-minicondav3创建名为deepchem的 conda 环境并安装env.yml安装 DeepChempip install -e .后运行测试。Doctest 测试仅限 Linux 与 Windows runner且always()保证即使前置步骤失败也继续执行DGLBACKENDpytorch pytest -v \ --ignore-globdeepchem/**/test*.py \ --ignore-globdeepchem/models/jax_models/* \ --ignoredeepchem/utils/dftutils.py \ --ignoredeepchem/models/torch_models/antibody_modeling.py \ --ignoredeepchem/models/torch_models/chemberta.py \ --ignoredeepchem/models/torch_models/hf_models.py \ --ignoredeepchem/models/torch_models/molformer.py \ --ignoredeepchem/models/torch_models/oneformer.py \ --ignoredeepchem/models/torch_models/prot_bert.py \ --doctest-modules deepchem --doctest-continue-on-failure该命令对deepchem包内所有模块的 docstring 示例进行 doctest 验证同时排除了重量级模型文件与test*.py文件Windows 上额外排除jax_models目录。DGLBACKENDpytorch环境变量指定 DGL 使用 PyTorch 后端。PyTest 测试按 Python 版本选择不同命令# Python 3.11 pytest -v -m not jax and not torch and not tensorflow and not dqc and not hf \ --ignoredeepchem/utils/test/test_sequence_utils.py deepchem # 其他版本 pytest -v -m not jax and not torch and not tensorflow and not dqc and not hf deepchem关键点在于 pytest 的-m标记marker机制核心测试只运行未标记为jax、torch、tensorflow、dqc、hf的用例而把各后端专属测试留给专门的设置工作流执行。这正是多后端项目避免一次全跑、互相拖累的典型做法。2.3 代码规范检查formatting.yml 工作流ci.rst 提到 CI 会使用 yapf、flake8 和 mypy 检查编码规范对应 formatting.yml名称为 Code FormattingYapf版本 0.32.0通过git diff --name-only $COMMIT_RANGE | grep .py$只对本次改动涉及的.py文件执行yapf -ddiff 模式检查格式化差异。这样避免了全量格式化检查的噪音Flake8执行source scripts/flake8_for_ci.sh。该脚本对deepchem/data、deepchem/dock、deepchem/feat、deepchem/hyper、deepchem/metalearning、deepchem/metrics、deepchem/rl、deepchem/splits、deepchem/trans、deepchem/utils、deepchem/molnet、deepchem/models等核心子包逐一运行flake8 --exclude__init__.py --count --show-source --statistics见 scripts/flake8_for_ci.shMypy执行mypy -p deepchem对全包做静态类型检查。linting job 运行在ubuntu-latest上、Python 3.10并通过 micromamba 安装合并后的依赖环境。值得注意yapf/flake8/mypy 三个步骤均通过if: (success() || failure())条件包裹确保即使前一个检查失败后续检查仍然继续执行尽可能一次性暴露所有问题。三、三后端专项测试JAX / TensorFlow / PyTorchDeepChem 的核心特性之一是同时支持 JAX、TensorFlow、PyTorch 三种深度学习框架。对应的工作流为jax_setup.yml、tensorflow_setup.yml、torch_setup.yml每个工作流都拆成构建与测试两个 job。3.1 构建 job验证后端可用性三个工作流的构建 job 逻辑一致仅依赖与导入检查对象不同工作流安装命令导入检查jax_setup.ymlpip install -e .[jax]python -c import deepchem; import jax;tensorflow_setup.ymlpip install -e .[tensorflow]python -c import deepchem; import tensorflow;torch_setup.ymlpip install -e .[torch]python -c import deepchem; import torch;可见 DeepChem 的setup.py通过 extras 机制.[jax]、.[tensorflow]、.[torch]暴露可选的后端安装入口。3.2 测试 job按 marker 精准筛选测试 job 的环境构建同样依赖conda-merge合并requirements/下的 yml 文件并最终执行带 marker 的 pytest# jax_setup.yml pytest -v -m jax deepchem # tensorflow_setup.yml pytest -v -m tensorflow deepchem # torch_setup.yml pytest -v -m torch deepchem由于 JAX 不支持 Windowsjax-test仅在ubuntu-latest上运行 Python 3.9/3.10/3.11TensorFlow 与 PyTorch 则在ubuntu-latestPython 3.8/3.10/3.11外加windows-latestPython 3.9上运行。这与 ci.rst 的描述完全一致Jaxubuntu latest Python 3.9-3.11运行带jax标记的 pytestTensorflowubuntu latest Python 3.8-3.11windows latest Python 3.9运行带tensorflow标记的 pytestPyTorchubuntu latest Python 3.8-3.11windows latest Python 3.9运行带pytorch标记的 pytest。这套设计说明 DeepChem 的测试用例通过 pytest marker 进行后端维度上的隔离新增一个后端模型时只需为其测试打上对应 markerCI 即可自动将其归入正确的专项工作流。四、文档测试与发布docs.yml 与 release.yml4.1 docs.yml文档构建与 doctestdocs.yml名称为 Test for documents在ubuntu-latest上使用 Python 3.9 与 3.11 两个版本按以下顺序执行在./docs目录下执行pip install -r requirements.txt安装文档构建依赖执行make clean html完整重建 Sphinx 文档执行make doctest_tutorials对examples/tutorials/下的教程进行 doctest执行make doctest_examples对examples/下的示例进行 doctest。文档相关入口位于 docs/Makefile配置文件为 docs/source/conf.py文档源文件在 docs/source/ 下按api_reference/、development_guide/、get_started/等目录组织。docstring 里的示例代码因此具备了可执行性避免文档与代码脱节。4.2 release.yml仅在打 tag 时运行release.yml名称为 Release与前几个工作流不同它的触发条件是推送 tagon: push: tags: [*]而不是 PR 或 master 推送pypi job在ubuntu-latest上使用 Python 3.9先完成构建与import deepchem检查然后安装setuptools、wheel、twine执行python setup.py sdist bdist_wheel --release生成发行包并用存储在仓库 Secrets 中的PYPI_API_TOKEN通过twine upload dist/*发布到 PyPIdocker jobneeds: [pypi]依赖 PyPI 发布成功登录 DockerHub 后使用 docker/tag/Dockerfile 作为构建上下文将镜像推送到deepchemio/deepchem:tag版本。因此 ci.rst 中Release 测试仅在对 tag 推送时运行、使用 ubuntu latest Python 3.9的描述实际涵盖了 PyPI 包发布与 Docker 镜像发布两个环节。五、网站重建触发器website_build_dispatch.ymlci.rst 的 Website Rebuild Trigger 一节说明了当新提交被推送到 master 分支时会触发website_build_dispatch工作流。查看 website_build_dispatch.yml 可以看到其实现- name: Repository Dispatch uses: peter-evans/repository-dispatchv3 with: token: ${{ secrets.WEBSITE_REPO_PAT }} repository: deepchem/deepchem.github.io event-type: rebuild-website该工作流通过peter-evans/repository-dispatchAction使用仓库 Secrets 中配置的WEBSITE_REPO_PAT令牌向deepchem.github.io仓库发送一个名为rebuild-website的 repository dispatch 事件从而触发 deepchem.io 官网与 DeepChem Book 文档站的重建。这正是文档站点随 master 代码自动同步更新的实现机制。六、依赖管理requirements 目录的文件家族ci.rst 的 Notes on Requirement Files 一节专门梳理了requirements/目录下各文件的用途。结合仓库实际文件 requirements/ 目录可以形成以下完整映射6.1 科学计算核心依赖env_common.yml列出 DeepChem 使用的科学计算依赖例如rdkit2023.09.5、numpy1.26、scipy1.12.0、pymc5.10、openmm、mdtraj、pdbfixer、biopython、lightgbm、xgboost、matminer、mordred、transformers4.51.3、gensimmol2vec 使用、tensorboard等。这些依赖的版本都经过固定或上限约束以保证 CI 与本地环境的可复现性env_ubuntu.yml / env_mac.yml包含仅在特定操作系统上有支持的科学依赖。目前主要是vina分子对接工具分别对应 Ubuntu 与 macOS 环境另见env_ubuntu_3_11.yml、env_mac_3_11.yml、env_mac_arm64.yml等按 Python 版本/架构细分的变体env_common_3_8.ymlPython 3.8 专用的科学依赖组合matminer 等库在旧 Python 上需要兼容版本因此 CI 中 Python 3.8 的 env.yml 会单独合并该文件。6.2 测试依赖env_test.yml主要用于开发/测试目的包含 env_test.yml 中列出的工具flake8、flaky、mypy1.15.0、pytest、pytest-cov、types-setuptools、yapf0.32.0、python-Levenshtein。其中yapf0.32.0与格式化工作流中的版本号严格对应mypy1.15.0的上限约束则避免类型检查器升级后产生新的误报。6.3 后端框架安装文件tensorflow/、torch/、jax/三个子目录存放深度学习后端的安装配置文件用途tensorflow/env_tensorflow.cpu.ymlTensorFlow CPU 版安装仅有 CPU 一种配置torch/env_torch.cpu.ymlPyTorch CPU 版安装torch/env_torch.gpu.ymlPyTorch GPU 版安装torch/env_torch.mac.cpu.ymlPyTorch macOS CPU 版安装torch/env_torch.win.cpu.ymlPyTorch Windows CPU 版安装jax/env_jax.cpu.ymlJAX CPU 版安装jax/env_jax.gpu.ymlJAX GPU 版安装正如 ci.rst 所说明的对于 torch 和 jaxCPU 与 GPU 的安装命令不同因此分别使用不同的安装文件tensorflow 仅有 CPU 配置。CI 中正是通过conda-merge将上述文件与env_common.yml、env_test.yml等按 OS/Python 版本组合成env.yml再交给 miniconda/micromamba 创建环境实现了公共依赖 平台依赖 测试依赖 后端依赖的模块化组合。七、编写单元测试的通用建议7.1 新增功能必须配套测试ci.rst 明确要求当为 DeepChem 添加新功能时必须同时添加对应的单元测试。这是保证 CI 质量防线有效性的前提。7.2 外部文件必须使用绝对路径当测试函数需要使用外部文件或附加文件时为避免 CI 环境中相对路径失效必须使用绝对路径。文档给出的标准写法如下import os current_dir os.path.dirname(os.path.abspath(__file__)) data_dir os.path.join(current_dir, Test_data_feature.csv) result newFeature(data_dir)这里的核心技巧是借助__file__获取测试文件自身所在目录再拼接数据文件名从而保证无论 CI runner 在哪个工作目录下执行 pytest都能正确定位测试数据文件。仓库中大量测试都遵循这一约定例如 deepchem/data/tests/、deepchem/feat/tests/data/ 等目录中存放了.csv、.sdf、.pdb、.fasta等测试数据文件供对应测试用例通过该模式引用。八、总结从 CI 设计看 DeepChem 的工程化思路综合来看DeepChem 的 CI 体系呈现出几个鲜明特点后端隔离通过 pytest markerjax/tensorflow/torch/dqc/hf与独立工作流将三大框架的测试完全解耦既避免互相干扰又能并行加速平台与版本矩阵以 UbuntuPython 3.8-3.11 WindowsPython 3.9为主体矩阵macOS 通过env_mac*.yml参与环境组合兼顾覆盖率与执行成本分阶段质量门禁构建/导入检查先行单元测试、doctest、格式检查yapf/flake8/mypy、文档构建依次把关每个阶段失败都不会阻断后续检查依赖模块化管理requirements/下的 yml 文件按科学依赖 / 平台依赖 / 测试依赖 / 后端依赖拆分通过conda-merge动态组合既保证可复现又避免重复维护发布与站点联动打 tag 自动发布 PyPI 包与 Docker 镜像master 推送自动触发官网重建形成开发-测试-发布-文档的完整闭环。对于希望为 DeepChem 贡献代码的开发者而言理解这套 CI 意味着提交 PR 前应确保本地通过 pytest注意 marker 选择、doctest、yapf、flake8、mypy 检查并为新功能补充使用绝对路径引用数据文件的单元测试同时留意依赖版本约束集中在requirements/目录下环境变更应优先考虑通过修改 yml 文件实现。【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻