持续集成#

持续集成(CI)是我们开发过程的一部分,它确保每一个贡献给 SciPy 的代码或文档都能正常工作,并且不会产生意想不到的影响。

注意

在提交或更新您的 PR 之前,请确保您已在本地测试过您的更改。请参阅 提交 PR 前的检查清单在本地运行 SciPy 测试

工作流程#

我们运行超过 20 个不同的工作流程,使用不同版本的依赖项,不同的架构等等。PR 必须通过所有这些检查才能被合并,以确保项目处于可持续的状态。

除了单元测试之外,还会检查文档字符串中的文档和示例。这些是常见的失败工作流程,因为 Sphinx 和 doctests 有非常严格的规则。这些方面非常重要,因为文档和示例是面向用户的元素。确保这些元素被正确渲染。

日志可能很长,但您总会发现为什么您的构建/测试没有通过检查。只需点击 Details 即可访问日志。

以下是所有正在使用的不同工作流程的列表。它们按 CI 资源提供商分组。

GitHub Actions#

  • Lint: PEP8 和代码风格

  • Windows Tests: Windows 的测试套件运行

  • Linux Tests: Linux 的测试套件运行

  • macOS Tests: macOS (x86_64) 的测试套件运行

  • Wheels builder: 为 SciPy 发布版本以及每日构建版本构建 wheels。

  • Check the rendered docs here!: 文档的实时预览

  • prerelease_deps_coverage_64bit_blas: 使用预发布版本的依赖项并检查覆盖率

  • gcc-9: 使用最低支持版本的 GCC 构建,安装 wheel,然后使用 python -OO 运行测试套件

  • Array API: 测试 Array API 支持

测试套件在 GitHub Actions 和其他平台上运行,涵盖一系列测试/环境条件:Python 和 NumPy 版本(最低支持到每日构建版本)、32 位 vs. 64 位、不同的编译器等等 - 有关详细信息,请参阅 .yml 配置文件。

CircleCI#

  • build_docs: 构建文档

  • build_scipy

  • run_benchmarks: 验证更改如何影响性能

  • refguide_check: 来自示例和基准测试的 doctests

CirrusCI#

  • Tests: 针对特定架构(如 musllinux、arm、aarch)的测试套件

  • Wheels: 构建并上传一些 wheels

跳过#

作为一个开源项目,我们可以使用一定配额的 CI 资源。最终,资源是有限的,我们应该谨慎使用它们。这就是为什么我们要求您在推送更改之前在本地验证更改。

根据提出的更改,您可能需要跳过部分检查。维护人员将酌情决定在集成之前重新运行某些测试。

可以通过在提交消息中添加特殊文本来实现跳过 CI

  • [skip actions]: 将跳过 GitHub Actions

  • [skip circle]: 将跳过 CircleCI

  • [skip cirrus]: 将跳过 CirrusCI

  • [docs only]: 将跳过 CircleCI 检查和 linter 以外的全部

  • [lint only]: 将跳过 linter 以外的全部

  • [skip ci]: 将跳过全部 CI

当然,您可以组合这些来跳过多个工作流程。

此跳过信息应放在新的一行上。在此示例中,我们只是更新了文档中的 .rst 文件,并要求跳过除相关文档检查(跳过 Cirrus 和 GitHub Actions 的工作流程)之外的所有检查

DOC: improve QMCEngine examples.

[docs only]

因测试持续时间导致的失败#

当测试执行时间超过阈值持续时间时,某些 CI 作业会安装 pytest-fail-slow 并报告失败。

  • 默认情况下,所有测试都受 5 秒的限制约束;即,在“完整”测试作业中使用选项 --fail-slow=5.0

  • 所有未标记为 slow (@pytest.mark.slow) 的测试都受 1 秒的限制约束;即,在“快速”测试作业中使用选项 --fail-slow=1.0

  • 使用 pytest.mark.fail_slow 装饰器进行例外处理;例如,可以将测试标记为 @pytest.mark.fail_slow(10),使其具有 10 秒的限制,无论它是“快速”还是“完整”测试套件的一部分。

如果在 PR 开发过程中的任何时候测试因超出时间限制而失败,请调整测试以确保将来不会失败。即使新测试没有失败,也请在 PR 合并之前检查名称中包含“fail slow”的工作流程的详细信息。其中包括接近(或已超过)其时间限制的测试列表。由于执行时间的变化,应调整执行时间接近阈值的测试,以避免即使其执行时间增加 50% 时也出现失败;典型的测试应具有更大的余量(至少 400%)。调整选项包括

  • 使测试更快。

  • 如果可以接受在减少的平台上运行测试,则将测试标记为 slow

  • 如果可以接受仅偶尔运行测试,则将测试标记为 xslow

  • 分解测试或对其进行参数化,并可能将其部分标记为 slow。请注意,这不会减少总测试持续时间,因此首选其他选项。

  • 对于不可避免的真正关键的慢速测试,请使用 pytest.mark.fail_slow 添加例外。

有关在本地处理慢速测试的更多信息,请参阅 在本地运行 SciPy 测试

Wheel 构建#

SciPy 发布版本和 每日 构建版本的 Wheels 是使用 cibuildwheel 在 Github Action 中构建的。该 Action 运行于

  • 当提交消息包含文本 [wheel build]

  • 每周一次的计划基础上

  • 手动启动时。

  • 当推送至存储库时,GitHub 引用以 refs/tags/v 开头(且不以 dev0 结尾)

该操作不在主 SciPy 存储库的分支上运行。创建的 wheels 可作为与该 Action 成功运行相关的工件。当 Action 按计划运行或手动启动时,这些 wheels 会上传到 scientific-python-nightly-wheels 存储库。

不建议在您自己的系统上使用 cibuildwheel 构建 scipy wheels,因为它会自动安装 gfortran 编译器和各种其他依赖项。相反,可以使用隔离的 Docker 容器来构建 Linux wheels。