概述
预生成为存储库、分支和 devcontainer.json 配置文件的特定组合组装 codespace 的主要组件。 它提供了一种快速创建新 codespace 的方法。 特别是对于复杂和/或大型的存储库,你可以使用预生成更快地创建新 codespace。
如果当前为存储库创建 codespace 的时间超过 2 分钟,则使用预生成可能会更好。 这是因为,使用预生成,会在创建 codespace 之前下载、安装和应用任何源代码、编辑器扩展、项目依赖项、命令和配置。
默认情况下,每当你将更改推送到代码仓库时,GitHub Codespaces 都会使用 GitHub Actions 自动更新你的预构建。
当某个存储库分支、某个开发容器配置文件以及你所在的区域支持预构建时,你在创建 codespace 时会在机器类型选项列表中看到“ 预构建已就绪”标签。 如果仍在创建预生成,你将看到“ 正在进行预生成”标签。 有关详细信息,请参阅“为代码库创建代码空间”。

从“代码空间”页面上的模板创建代码空间时, GitHub 可能会自动使用预生成来加快创建时间。 有关模板的详细信息,请参阅 通过模板创建 codespace。
注意
创建的每个预构建都会占用存储空间,这会产生可计费的费用;或者如果仓库归你的个人 GitHub 账户所有,则会占用你每月附带的部分存储空间。 有关详细信息,请参阅“GitHub Codespaces 计费”。
预生成过程
要创建预生成,请设置预生成配置。 保存配置时,会运行一个 GitHub Actions 工作流来创建每个所需的预构建;每个预构建对应一个工作流。 每当需要更新配置的预构建时,工作流也会运行。 在定期间隔、推送到启用预生成的存储库时,或更改开发容器配置时,可能会发生这种情况。 有关详细信息,请参阅“配置预生成”。
当预构建配置工作流运行时,GitHub 会创建一个临时代码空间,执行设置操作,一直到并包括 devcontainer.json 文件中的任何 onCreateCommand 和 updateContentCommand 命令。 在创建预生成期间不会运行任何 postCreateCommand 命令。 有关这些命令的详细信息,请参阅devcontainer.json文档中的VS Code参考。 然后创建并存储生成的容器的快照。
与其他 GitHub Actions 工作流一样,运行预构建配置工作流将消耗您账户中包含的部分 GitHub Actions 分钟(如果有的话),或者按 GitHub Actions 分钟计费。 存储 codespace 预生成的计费方式与存储活动或已停止的 codespace 相同。 有关详细信息,请参阅“GitHub Codespaces 计费”。
从预生成环境创建代码空间时,GitHub 会从存储中下载现有的容器快照,并将其部署到一台全新的虚拟机上,然后执行开发容器配置中指定的其余命令。 由于已执行许多操作(例如克隆存储库),因此从预生成创建 codespace 可能比在没有预生成的情况下创建 codespace 要快得多。 存储库很大和/或 onCreateCommand 命令的运行时间很长时会出现这种情况。
关于将更改推送到已启用预生成的分支
默认情况下,每次向具有预构建配置的分支推送代码,都会触发一次由 GitHub 管理的 GitHub Actions 工作流运行,以更新预构建。 预生成工作流有一个并发限制,即,对于一个给定的预生成配置,一次只能运行一个工作流,除非进行的更改影响到相关存储库的开发容器配置。 有关详细信息,请参阅“开发容器简介”。 如果运行已在进行中,则最近排队的工作流运行将在当前运行完成后运行。
将预生成设置为在每次推送时更新,意味着如果存储库中存在非常频繁的推送,预生成更新将至少与运行预生成工作流所需的频率一样频繁。 也就是说,如果工作流运行通常需要一个小时才能完成且运行成功,那么大约每小时会为存储库创建一次预生成,如果分支上有更改开发容器配置的推送,则创建预生成会更频繁。
例如,假设针对有预生成配置的分支连续进行 5 次推送。 在这种情况下:
-
在第一次推送中会启动工作流运行,以更新预生成。
-
如果余下的 4 次推送不会影响开发容器配置,这些工作流运行将以“挂起”状态排队。
如果余下 4 次推送中的任何一次更改了开发容器配置,服务将不会跳过该推送,并将立即运行预生成创建工作流,运行成功后将相应地更新预生成。
-
首次工作流运行完成后,将取消第 2、3 和 4 次推送的工作流运行,并运行队列中最后一个工作流(用于第 5 次推送),以更新预生成。