# 配置预生成

可以配置你的项目，使其在你每次将更改推送到存储库时，自动预先构建 codespace。

可以为存储库的特定分支与特定开发容器配置文件的组合设置预生成配置。

从启用预生成的父分支创建的所有分支通常也会获得同一开发容器配置的预生成。 这是因为使用相同开发容器配置的子分支与父分支的预构建在大多数情况下大体相同，因此开发人员也可以从这些分支中受益，享受更快的代码空间创建时间。 请参阅“[开发容器简介](/zh/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)”。

通常，如果为分支配置预生成，预生成可用于多种计算机类型。 但是，如果存储库大于 32 GB，预生成就不适用于 2 核和 4 核计算机类型，因为这些计算机类型提供的存储限制为 32 GB。

## 先决条件

预生成是使用 GitHub Actions 创建的。 因此，必须在要为其配置预生成的存储库中启用 GitHub Actions。 请参阅“[管理存储库的GitHub Actions设置](/zh/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository)”。

可以在个人帐户拥有的任何存储库中设置预生成。 预生成过程将占用存储空间，这将产生计费费用；对于个人帐户拥有的存储库，则会占用每月包含的存储空间的一部分。

> \[!NOTE]
> 如果为分支存储库创建预生成，则这些预生成的存储成本将从每月包含的存储中减去（如有）。 如果已使用完所有包含的存储，并且已设置计费，则会对个人帐户进行收费。 即使为分支创建的 codespace 是由拥有父存储库的组织支付，也是如此。 请参阅 [GitHub Codespaces 计费](/zh/billing/concepts/product-billing/github-codespaces#how-costs-are-assigned-to-a-billable-account)。

对于组织拥有的存储库，如果组织已加入 GitHub Team 或 GitHub Enterprise 计划，则可以设置预生成。 此外，必须在组织帐户或其父企业上添加付款方式并为 GitHub Codespaces 设置支出限制。 请参阅“[设置预算以控制按流量计费的产品的支出](/zh/billing/managing-billing-for-your-products/managing-billing-for-github-codespaces/managing-the-spending-limit-for-github-codespaces#managing-the-github-codespaces-spending-limit-for-your-organization-account)”和“[GitHub的计划](/zh/get-started/learning-about-github/githubs-plans)”。

## 配置预生成

1. 在 GitHub 上，导航到存储库的主页面。

2. 在仓库名称下，单击 <svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-gear" aria-label="gear" role="img"><path d="M8 0a8.2 8.2 0 0 1 .701.031C9.444.095 9.99.645 10.16 1.29l.288 1.107c.018.066.079.158.212.224.231.114.454.243.668.386.123.082.233.09.299.071l1.103-.303c.644-.176 1.392.021 1.82.63.27.385.506.792.704 1.218.315.675.111 1.422-.364 1.891l-.814.806c-.049.048-.098.147-.088.294.016.257.016.515 0 .772-.01.147.038.246.088.294l.814.806c.475.469.679 1.216.364 1.891a7.977 7.977 0 0 1-.704 1.217c-.428.61-1.176.807-1.82.63l-1.102-.302c-.067-.019-.177-.011-.3.071a5.909 5.909 0 0 1-.668.386c-.133.066-.194.158-.211.224l-.29 1.106c-.168.646-.715 1.196-1.458 1.26a8.006 8.006 0 0 1-1.402 0c-.743-.064-1.289-.614-1.458-1.26l-.289-1.106c-.018-.066-.079-.158-.212-.224a5.738 5.738 0 0 1-.668-.386c-.123-.082-.233-.09-.299-.071l-1.103.303c-.644.176-1.392-.021-1.82-.63a8.12 8.12 0 0 1-.704-1.218c-.315-.675-.111-1.422.363-1.891l.815-.806c.05-.048.098-.147.088-.294a6.214 6.214 0 0 1 0-.772c.01-.147-.038-.246-.088-.294l-.815-.806C.635 6.045.431 5.298.746 4.623a7.92 7.92 0 0 1 .704-1.217c.428-.61 1.176-.807 1.82-.63l1.102.302c.067.019.177.011.3-.071.214-.143.437-.272.668-.386.133-.066.194-.158.211-.224l.29-1.106C6.009.645 6.556.095 7.299.03 7.53.01 7.764 0 8 0Zm-.571 1.525c-.036.003-.108.036-.137.146l-.289 1.105c-.147.561-.549.967-.998 1.189-.173.086-.34.183-.5.29-.417.278-.97.423-1.529.27l-1.103-.303c-.109-.03-.175.016-.195.045-.22.312-.412.644-.573.99-.014.031-.021.11.059.19l.815.806c.411.406.562.957.53 1.456a4.709 4.709 0 0 0 0 .582c.032.499-.119 1.05-.53 1.456l-.815.806c-.081.08-.073.159-.059.19.162.346.353.677.573.989.02.03.085.076.195.046l1.102-.303c.56-.153 1.113-.008 1.53.27.161.107.328.204.501.29.447.222.85.629.997 1.189l.289 1.105c.029.109.101.143.137.146a6.6 6.6 0 0 0 1.142 0c.036-.003.108-.036.137-.146l.289-1.105c.147-.561.549-.967.998-1.189.173-.086.34-.183.5-.29.417-.278.97-.423 1.529-.27l1.103.303c.109.029.175-.016.195-.045.22-.313.411-.644.573-.99.014-.031.021-.11-.059-.19l-.815-.806c-.411-.406-.562-.957-.53-1.456a4.709 4.709 0 0 0 0-.582c-.032-.499.119-1.05.53-1.456l.815-.806c.081-.08.073-.159.059-.19a6.464 6.464 0 0 0-.573-.989c-.02-.03-.085-.076-.195-.046l-1.102.303c-.56.153-1.113.008-1.53-.27a4.44 4.44 0 0 0-.501-.29c-.447-.222-.85-.629-.997-1.189l-.289-1.105c-.029-.11-.101-.143-.137-.146a6.6 6.6 0 0 0-1.142 0ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM9.5 8a1.5 1.5 0 1 0-3.001.001A1.5 1.5 0 0 0 9.5 8Z"></path></svg>“Settings”\*\*\*\*。 如果看不到“设置”选项卡，请选择“<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-kebab-horizontal" aria-label="kebab horizontal icon" role="img"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg>”下拉菜单，然后单击“设置”。

   ![存储库标头的屏幕截图，其中显示了选项卡。 “设置”选项卡以深橙色边框突出显示。](/assets/images/help/repository/repo-actions-settings.png)

3. 在边栏的“Code & automation”部分，单击“<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-codespaces" aria-label="codespaces" role="img"><path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path></svg> Codespaces”\*\*\*\*。

4. 在页面的“预生成配置”部分，单击“设置预生成”。

   ![“Codespaces”设置页的“预生成配置”部分的屏幕截图，其中显示了“设置预生成”按钮。](/assets/images/help/codespaces/prebuilds-set-up.png)

5. 选择要为其设置预生成的分支。

   ![预生成“配置”设置的屏幕截图，其中包含一个下拉菜单，列出了可供选择的分支。 当前已选择主分支。](/assets/images/help/codespaces/prebuilds-choose-branch.png)

   > \[!NOTE]
   > 从启用预生成版本的基础分支创建的任何分支通常也会获得相同开发容器配置的预生成版本。 例如，如果在存储库的默认分支上为开发容器配置文件启用预生成，则大多数情况下，基于默认分支的分支也会获得同一开发容器配置的预生成。

6. 可以选择地，在显示的“配置文件”的下拉菜单中，选择要用于预生成的 \*\*\*\* 配置文件。 请参阅“[开发容器简介](/zh/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers#devcontainerjson)”。

   ![配置文件下拉菜单的屏幕截图。 列出了四个配置文件，其中当前已选择“.devcontainer/devcontainer.json”。](/assets/images/help/codespaces/prebuilds-choose-configfile.png)

7. 选择要如何自动触发预生成更新。

   * **每次推送**（默认设置）- 通过此设置，预生成将在每次对给定分支进行推送时更新。 这可确保从预生成生成的 codespace 始终包含最新的 codespace 配置，包括任何最近添加或更新的依赖项。

   * **配置更改时** - 借助此设置，更改以下任何文件时都会更新预生成：

     * `.devcontainer/devcontainer.json`

       > \[!NOTE]

       ```
          `devcontainer.json` 的子目录中的 `.devcontainer` 文件更改不会触发预生成更新。
       ```

     * `build.dockerfile` 文件的 `.devcontainer/devcontainer.json` 属性中引用的 Dockerfile。

     此设置可确保在从预生成生成 codespace 时使用对存储库的开发容器配置文件进行的更改。 更新预生成的 GitHub Actions 工作流的运行频率较低，因此此选项使用的 GitHub Actions 分钟数较少。 但是，此选项不保证 codespace 始终包含最近添加或更新的依赖项，因此在创建 codespace 后可能需要手动添加或更新这些依赖项。

   * **计划** - 使用此设置，可以根据你定义的自定义计划更新预生成。 这可以减少 GitHub Actions 的使用时间，但是，使用此选项时，创建的 codespaces 可能不会使用最新的开发容器配置变更。

   ![“预生成触发器”设置的屏幕截图。 选择“计划”选项，并将其设置为“每天”“下午 1 点”和“下午 3:30”。](/assets/images/help/codespaces/prebuilds-triggers.png)

8. 根据需要，可以选择“减少仅对特定区域可用的预生成”，以便仅在指定区域中创建预生成。 选择要在其中提供预生成的区域。

   默认情况下，预生成文件会在所有可用区域内创建，每个预生成文件都会产生存储费用。

   ![“区域可用性”设置的屏幕截图。 选择了“减少仅对特定区域可用的预生成”，其中选择了两个区域。](/assets/images/help/codespaces/prebuilds-regions.png)

   > \[!NOTE]
   >
   > * 每个区域的预生成会产生单独的存储费用。 因此，您应只为已知将使用的区域启用预构建。
   > * 开发人员可以为 GitHub Codespaces 设置其默认区域，这样就可以减少要启用预生成的区域。 请参阅“[为 GitHub Codespaces 设置默认区域](/zh/codespaces/setting-your-user-preferences/setting-your-default-region-for-github-codespaces)”。

9. 根据需要，可以在“模板历史记录”下设置要保留的预生成模板版本数。 可以输入介于 1 和 5 之间的任意数字。 默认保存的版本数为 2，这意味着只保存最新版本的和上一个版本的预生成。

   ![“模板历史记录”设置的屏幕截图。 将其设置为 2 个版本。](/assets/images/help/codespaces/prebuilds-template-history-setting.png)

   根据预生成触发器设置，预生成可能会随每个推送或每个开发容器配置的更改而更改。 保留较旧版本的预生成构建允许你使用不同于当前预生成的开发容器配置，从较旧的提交中创建预生成构建。 通过此设置可将保留的版本数设置为所需的级别。

   如果将保存的预生成版本数设置为 1，GitHub Codespaces 将仅保存最新版本的预生成，并在每次模板更新时删除旧版本。 这意味着，如果返回到较旧的开发容器配置，则不会获取预生成的 codespace。

   保留的每个预生成版本都需支付存储费用。 例如，如果要在 4 个区域中生成预生成并保留 2 个版本，则最多需要支付 8 个预生成的存储费用。 请参阅“[GitHub Codespaces 计费](/zh/billing/managing-billing-for-your-products/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#codespaces-pricing)”。

10. 根据需要，可以添加用户或团队，以便在此配置的预生成工作流运行失败时发出通知。 可以开始键入用户名、团队名称或全名，然后在显示名称后单击该名称以将其添加到列表中。 发生预生成失败时，添加的用户或团队将收到电子邮件，其中包含工作流运行日志链接，以帮助进一步调查。

    ![“失败通知”设置的屏幕截图。 已添加名为“octocat-team”的团队。](/assets/images/help/codespaces/prebuilds-failure-notification-setting.png)

    > \[!NOTE]
    > 只有当用户在其个人设置中启用了针对失败的 Actions 工作流的通知时，他们才会收到预生成失败的通知。 请参阅“[配置通知](/zh/account-and-profile/managing-subscriptions-and-notifications-on-github/setting-up-notifications/configuring-notifications#github-actions-notification-options)”。

11. 根据需要，单击页面底部的“显示高级选项”。

    ![预生成配置页底部的屏幕截图。 “显示高级选项”链接以深橙色边框突出显示。](/assets/images/help/codespaces/show-advanced-options.png)

    在“高级选项”部分中，如果选择“禁用预生成优化”，则在最新的预生成工作流失败或当前正在运行时，将在没有预生成的情况下创建 Codespaces。 请参阅“[对预构建进行故障排除](/zh/codespaces/troubleshooting/troubleshooting-prebuilds#preventing-out-of-date-prebuilds-being-used)”。

12. 单击 **“创建”** 。

    如果存储库的开发容器配置指定了访问其他存储库的权限，你将看到一个授权页面。 有关 `devcontainer.json` 文件中如何指定此内容的详细信息，请参阅“[管理对代码空间中其他存储库的访问权限](/zh/codespaces/managing-your-codespaces/managing-repository-access-for-your-codespaces)”。

    单击 <svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-chevron-down" aria-label="The expand down icon" role="img"><path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path></svg> 查看请求权限的详细信息。

    ![预生成配置的授权页的屏幕截图。 此请求中列出了三种权限。](/assets/images/help/codespaces/prebuild-authorization-page.png)

    单击“授权并继续”，授予这些权限来创建预生成。 另外，可以单击“在未经授权的情况下继续”，但如果这样做，从生成的预生成创建的 codespace 可能无法正常工作。

    > \[!NOTE]
    > 使用此预生成创建 Codespaces 的用户也需要授予这些权限。

创建预生成配置后，它会列在存储库设置的 GitHub Codespaces 页面中。 GitHub Actions 工作流被排入队列，随后会运行，根据您选择的分支和开发容器配置文件在指定区域内创建预构建。

![预生成配置列表的屏幕截图。 列出了一个预构建，标记为“当前正在运行”。 右侧是“查看输出”按钮。](/assets/images/help/codespaces/prebuild-configs-list.png)

有关编辑和删除预生成配置的信息，请参阅 [管理预构建](/zh/codespaces/prebuilding-your-codespaces/managing-prebuilds)。

## 配置环境变量

若要让预生成过程能够访问创建开发环境所需的环境变量，可将这些变量设置为 Codespaces 存储库机密或为 Codespaces 组织机密。 以这种方式创建的机密将可被任何从此存储库创建代码空间的人访问。 请参阅“[管理存储库或组织的开发环境机密](/zh/codespaces/managing-codespaces-for-your-organization/managing-development-environment-secrets-for-your-repository-or-organization#adding-secrets-for-a-repository)”。

预构建在创建代码空间环境时不能使用用户级别的机密，因为这些机密在代码空间创建完成后才会可用。

## 配置在预构建中包含的耗时任务

可以在 `onCreateCommand` 中使用 `updateContentCommand` 和 `devcontainer.json` 命令，将耗时的过程包含在预构建创建中。 请参阅 Visual Studio Code 文档，[devcontainer.json](https://code.visualstudio.com/docs/remote/devcontainerjson-reference#_lifecycle-scripts) 参考资料。

```
          `onCreateCommand` 只在创建预生成时运行一次，而 `updateContentCommand` 在预生成创建和预生成后续更新时运行。 增量生成应包含在 `updateContentCommand` 中，因为它们代表项目的源，并且需要包含在每次预生成更新中。
```

## 延伸阅读

* [允许预构建访问其他存储库](/zh/codespaces/prebuilding-your-codespaces/allowing-a-prebuild-to-access-other-repositories)
* [对预构建进行故障排除](/zh/codespaces/troubleshooting/troubleshooting-prebuilds)