# 关于 GitHub Codespaces 预构建

GitHub Codespaces 预生成有助于加快为大型或复杂存储库创建新的 codespace 的速度。

## 概述

预生成为存储库、分支和 `devcontainer.json` 配置文件的特定组合组装 codespace 的主要组件。 它提供了一种快速创建新 codespace 的方法。 特别是对于复杂和/或大型的存储库，你可以使用预生成更快地创建新 codespace。

如果当前为存储库创建 codespace 的时间超过 2 分钟，则使用预生成可能会更好。 这是因为，使用预生成，会在创建 codespace 之前下载、安装和应用任何源代码、编辑器扩展、项目依赖项、命令和配置。

默认情况下，每当将更改推送到存储库时，GitHub Codespaces 都会使用 GitHub Actions 自动更新预生成。

当预生成可用于存储库的特定分支、特定开发容器配置文件和你所在的区域时，你会在创建 codespace 时在计算机类型选项列表中看到“<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-zap" aria-label="zap" role="img"><path d="M9.504.43a1.516 1.516 0 0 1 2.437 1.713L10.415 5.5h2.123c1.57 0 2.346 1.909 1.22 3.004l-7.34 7.142a1.249 1.249 0 0 1-.871.354h-.302a1.25 1.25 0 0 1-1.157-1.723L5.633 10.5H3.462c-1.57 0-2.346-1.909-1.22-3.004L9.503.429Zm1.047 1.074L3.286 8.571A.25.25 0 0 0 3.462 9H6.75a.75.75 0 0 1 .694 1.034l-1.713 4.188 6.982-6.793A.25.25 0 0 0 12.538 7H9.25a.75.75 0 0 1-.683-1.06l2.008-4.418.003-.006a.036.036 0 0 0-.004-.009l-.006-.006-.008-.001c-.003 0-.006.002-.009.004Z"></path></svg> Prebuild ready”标签。 如果预构建仍在进行中，你将看到“<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-history" aria-label="history" role="img"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg> 预构建正在进行”标签。 有关详细信息，请参阅“[为代码库创建代码空间](/zh/codespaces/developing-in-a-codespace/creating-a-codespace-for-a-repository#creating-a-codespace-for-a-repository)”。

![可用机器类型的列表的屏幕截图：2 核、4 核、8 核、16 核和 32 核，全部标记为“预建就绪”。](/assets/images/help/codespaces/choose-custom-machine-type.png)

根据“你的 codespace”页面上的模板创建 codespace 时，GitHub 可能会自动使用预生成来加快创建时间。 有关模板的详细信息，请参阅 [通过模板创建 codespace](/zh/codespaces/developing-in-a-codespace/creating-a-codespace-from-a-template)。

> \[!NOTE]
> 创建的每个预生成版本都会消耗存储空间，这将产生计费费用，或者对于你的个人 GitHub 帐户拥有的存储库，将使用你每月包含的部分存储空间。 有关详细信息，请参阅“[GitHub Codespaces 计费](/zh/billing/concepts/product-billing/github-codespaces)”。

## 预生成过程

要创建预生成，请设置预生成配置。 保存配置时，将运行 GitHub Actions 工作流以创建每个所需的预生成；每个预生成一个工作流。 每当需要更新配置的预构建时，工作流也会运行。 在定期间隔、推送到启用预生成的存储库时，或更改开发容器配置时，可能会发生这种情况。 有关详细信息，请参阅“[配置预生成](/zh/codespaces/prebuilding-your-codespaces/configuring-prebuilds#configuring-prebuilds)”。

运行预生成配置工作流时，GitHub 会创建一个临时 codespace，执行包括 `onCreateCommand` 文件中的 `updateContentCommand` 和 `devcontainer.json` 命令在内的设置操作。 在创建预生成期间不会运行任何 `postCreateCommand` 命令。 有关使用这些命令的详细信息，请参阅 VS Code 文档中的 [`devcontainer.json` 参考](https://code.visualstudio.com/docs/remote/devcontainerjson-reference#_devcontainerjson-properties)。 然后创建并存储生成的容器的快照。

与其他 GitHub Actions 工作流一样，运行预生成配置工作流会占用帐户中包含的一些 GitHub Actions 分钟（如果有），或者会产生 GitHub Actions 分钟的费用。 存储 codespace 预生成的计费方式与存储活动或已停止的 codespace 相同。 有关详细信息，请参阅“[GitHub Codespaces 计费](/zh/billing/managing-billing-for-your-products/managing-billing-for-github-codespaces/about-billing-for-github-codespaces)”。

从预构建环境创建 codespace 时，GitHub 会从存储中下载现有的容器快照，并将其部署到全新的虚拟机上，以完成开发容器配置中指定的剩余命令。 由于已执行许多操作（例如克隆存储库），因此从预生成创建 codespace 可能比在没有预生成的情况下创建 codespace 要快得多。 存储库很大和/或 `onCreateCommand` 命令的运行时间很长时会出现这种情况。

## 关于将更改推送到已启用预生成的分支

默认情况下，每次推送到有预生成配置的分支，都会运行一个 GitHub 托管的 GitHub Actions 工作流来更新预生成。 预生成工作流有一个并发限制，即，对于一个给定的预生成配置，一次只能运行一个工作流，除非进行的更改影响到相关存储库的开发容器配置。 有关详细信息，请参阅“[开发容器简介](/zh/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)”。 如果运行已在进行中，则最近排队的工作流运行将在当前运行完成后运行。

将预生成设置为在每次推送时更新，意味着如果存储库中存在非常频繁的推送，预生成更新将至少与运行预生成工作流所需的频率一样频繁。 也就是说，如果工作流运行通常需要一个小时才能完成且运行成功，那么大约每小时会为存储库创建一次预生成，如果分支上有更改开发容器配置的推送，则创建预生成会更频繁。

例如，假设针对有预生成配置的分支连续进行 5 次推送。 在这种情况下：

* 在第一次推送中会启动工作流运行，以更新预生成。

* 如果余下的 4 次推送不会影响开发容器配置，这些工作流运行将以“挂起”状态排队。

  如果余下 4 次推送中的任何一次更改了开发容器配置，服务将不会跳过该推送，并将立即运行预生成创建工作流，运行成功后将相应地更新预生成。

* 首次工作流运行完成后，将取消第 2、3 和 4 次推送的工作流运行，并运行队列中最后一个工作流（用于第 5 次推送），以更新预生成。