描述#
本 SPEC 描述了如何针对多个广泛使用的项目的每日构建轮子进行测试,以及如何为您的项目创建每日构建轮子。本文档使用“每日构建”一词来指代一些半定期间隔,例如每天、每周或每三天。
在使用依赖项的每日构建版本的同时定期运行项目的测试,可以让你在发布新版本之前发现由上游更改引起的问题。这样,潜在的问题就可以在它们进入发布版本之前得到解决,因为一旦进入发布版本,修改或回滚某些内容就会变得更加困难。
定期为您的项目创建每日构建轮子,可以让依赖您项目的项目对即将发生的更改提供反馈。与针对依赖项的每日构建进行测试一样,这使您的依赖项有机会在问题进入发布版本之前报告问题。
核心项目认可#
生态系统采用#
徽章#
项目可以通过包含 SPEC 徽章来突出显示它们对本 SPEC 的采用。
[](https://scientific-python.cn/specs/spec-0004/)
|SPEC 4 — Using and Creating Nightly Wheels|
.. |SPEC 4 — Using and Creating Nightly Wheels| image:: https://img.shields.io/badge/SPEC-4-green?labelColor=%23004811&color=%235CA038
:target: https://scientific-python.cn/specs/spec-0004/
实施#
本节概述了如何实施使用和构建每日构建轮子的方法。我们假设您的项目已经具有一定的 CI 基础设施,并且您需要将其与现有设置相结合。在“注释”部分,我们链接到已在其设置中实施此方法的项目,为您提供完整设置的示例。
使用每日构建轮子进行测试#
我们建议项目添加一个每周的 cron 作业,以使用依赖项的每日构建版本运行其测试。当 cron 作业遇到错误时,应自动在您的存储库中打开一个问题。
如果您发现问题,请调查这是否是由于已知的弃用或错误修复导致的。如果您认为两者都不是,请将其报告给相关的上游项目。
要安装依赖项的每日构建版本,请检查哪些依赖项在https://anaconda.org/scientific-python-nightly-wheels/上可用。例如,要安装 NumPy 和 SciPy 的每日构建版本,请使用
python -m pip install --pre --upgrade --extra-index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple numpy scipy
项目如何在 CI 设置中实施此方法的完整示例链接在“注释”部分。
构建每日构建轮子#
为您的项目实施此方法需要几个步骤
- 访问https://anaconda.org/scientific-python-nightly-wheels/,这是用于托管每日构建轮子的位置
- 设置一个 CI 步骤,用于为您的项目构建轮子
- 设置一个 CI 步骤,用于将轮子上传到https://anaconda.org/scientific-python-nightly-wheels/
对于步骤 (1),请访问https://github.com/scientific-python/upload-nightly-action并创建一个问题以请求访问权限。列出您维护并希望为其上传每日构建版本的项目。我们会回复问题并告知您接下来会发生什么。
步骤 (2) 的工作取决于您的项目。您可能已经在为您的发布版本执行此操作。需要记住的部分是定期构建轮子,至少每周一次。
对于步骤 (3),有一个您可以使用的 GitHub Action。您可以在https://github.com/scientific-python/upload-nightly-action找到此 Action。要在您的“构建轮子工作流”中使用它,请添加以下行作为附加步骤
- name: Upload wheel
uses: scientific-python/upload-nightly-action@main
with:
artifacts_path: dist/
anaconda_nightly_upload_token: ${{ secrets.UPLOAD_TOKEN }}
项目如何在 CI 设置中实施此方法的完整示例链接在“注释”部分。
工件清理策略位于https://anaconda.org/scientific-python-nightly-wheels#
为了避免托管过时的开发版本,以及为了清理空间,我们确实有一个保留策略:
- 最新的**N 个版本**
- **M 天**内创建的工件
超出这些范围的任何版本都会作为每日 cron 作业的一部分自动删除。项目可能出于某些原因要求将其添加到免于此自动清理的列表中,但在这种情况下,清理旧的、未使用的版本的责任将由项目本身承担。
注意:N
和 M
的实际值在https://github.com/scientific-python/upload-nightly-action存储库中定义和记录。
添加新项目的流程#
站点管理员来自科学 Python 社区的活跃成员。理想情况下,管理员的集合包含来自不同项目和底层组织的广泛的社区成员。这是为了确保社区拥有轮子托管基础设施和由共识管理的管理,而不是由任何个人、项目或组织单方面做出决策。添加新的管理员需要创建一个问题。在项目在https://github.com/scientific-python/upload-nightly-action上创建一个问题以请求上传轮子的访问权限后,管理员必须回复该请求。
我们希望对新的项目上传轮子保持开放态度。同时,在授予访问权限之前,我们需要进行一些尽职调查,因为已批准的项目将在科学 Python 生态系统中获得广泛的曝光。恶意行为者可能会滥用这一点。
项目的指定代表应在https://anaconda.org上分别创建一个帐户,并将他们的用户名与 Anaconda 上科学 Python 组织的管理员共享。为了提高弹性,我们建议每个项目至少有两名注册代表。
然后,代表可以在https://anaconda.org/[user]/settings/access生成一个个人访问令牌,并在 CI 中使用它来上传轮子。该令牌应仅具有“允许上传到标准 Python 存储库”、“允许读取 API 站点访问权限”和“允许写入 API 站点访问权限”范围。出于安全原因,应避免在组织级别创建令牌。
下一步是将轮子进行初始上传,以便在 anaconda.org 上创建包列表。完成此操作后,您可以撤销令牌并将新用户添加到其项目中。每个项目都应至少有一位也是项目管理员的用户。
此时,请告知用户他们已添加,并且可以创建个人访问令牌(如上所述)。他们现在可以上传新的轮子并对他们的项目执行维护操作。
注释#
- 构建和上传 scikit-learn 轮子的 GitHub Action 工作流,作为构建轮子和将它们上传到每日构建区域的示例。
- 构建和上传 NumPy 轮子的 GitHub Action 工作流
- 例如一个 GitHub Action 工作流,它为失败的 CI 运行创建跟踪问题
- 例如在 NetworkX 中使用此 action发布每日构建版本。
- 例如一个基于 Jupyter Notebook 的教程存储库,用于测试多个版本组合,包括使用开发版本的每日构建轮子。
astropy
使用依赖 OpenAstronomy 的工作流发布自己的每日构建轮子。它的直接依赖项pyerfa
也具有每日构建轮子此处。