GitHub Codespaces
由于开发环境在安全方面存在很大问题,因此将其虚拟化并为每个产品提供特定的机器是一个不错的主意。这样,你可以实施最小权限原则,并且工程师不必在他们的机器上使用本地管理员权限。你还可以限制为特定产品所需的工具数量,从而最小化攻击面。
当然,你可以使用传统的虚拟桌面基础设施(VDI)镜像来实现这一点,但你也可以使用一种更轻量的选择:开发容器(dev containers)(请参见 https://code.visualstudio.com/docs/remote/containers,这是一个基于 Visual Studio Code(VS Code)客户端-服务器架构的扩展)。你可以将 VS Code 连接到一个正在运行的容器,或者实例化一个新的容器实例。完整的配置存储在代码库中(即配置即代码),并且你可以与团队共享相同的开发容器配置。
开发容器的一种特殊形式是GitHub Codespaces,它是一个托管在 Azure 上的虚拟开发环境。你可以选择不同的虚拟机(VM)规格,从2核/4GB内存/32GB存储到32核/64GB内存/128GB存储不等。虚拟机的启动时间非常快。默认镜像超过35GB,启动时间不到10秒!
基础镜像包含了开发 Python、Node.js、JavaScript、TypeScript、C、C++、Java、.NET、PHP、PowerShell、Go、Ruby、Rust 和 Jekyll 所需的所有内容。它还包括大量其他开发工具和实用程序,如 git、Oh My Zsh、GitHub 命令行接口(GitHub CLI)、kubectl、Gradle、Maven 和 vim。运行 devcontainer-info content-url
命令可以在你的 codespace 内获取该镜像的完整工具列表。
但你不必使用基础镜像,你可以使用开发容器完全自定义你的 codespace。你可以通过浏览器中的 VS Code、你本地的 VS Code 实例或使用终端中的 SSH 来操作你的 codespace。如果你在 codespace 中运行应用程序,你可以将端口转发到本地机器进行测试。

例如,如果你启用了 Codespaces,你可以在一个新的 codespace 中打开 https://github.com/wulfland/AccelerateDevOps 仓库(见图13.6)。该仓库没有 dev container 配置,因此它将加载默认镜像:

你可以在前面的截图中看到,我已经在主分支上运行了一个 codespace。除了创建一个新的 codespace,我也可以选择打开现有的 codespace。选择虚拟机大小(见图13.7):

在终端中,进入 ch9_release/src/Tailwind.Traders.Web
目录并构建并运行应用程序:
$ cd ch9_release/src/Tailwind.Traders.Web
$ dotnet build
$ dotnet run
这将启动一个监听 5000 和 5001 端口的 Web 服务器。Codespaces 会自动检测并将端口 5000 转发到本地端口。只需点击“在浏览器中打开”,即可在本地浏览器中查看运行在 codespace 内的应用程序(见图13.8):

你还可以在 PORTS 标签页中手动添加需要转发的端口,并更改可见性,如果你希望与同事共享一个链接,让他们尝试新功能(见图13.9):

如果你想对开发环境有更多控制,可以在你的 codespace 中创建一个 dev container。通过点击左下角绿色的 Codespaces 按钮或在 Mac 上按 Shift + Command + P、在 Windows 上按 Ctrl + Shift + P 打开命令面板,选择 “Codespaces: Add Development Container Configuration Files…”。然后按照向导选择安装的语言和功能。向导将会在你的仓库根目录下创建一个 .devcontainer
文件夹,里面有两个文件:devcontainer.json
文件和 Dockerfile
文件。
Dockerfile
文件定义了在 codespace 初始化时创建的容器。这个文件可以非常简单,最重要的是包含一个 FROM
语句,指定继承的基础镜像。
在 devcontainer.json
文件中,你可以传递用于镜像创建的参数,定义与所有团队成员共享的 VS Code 设置,使用默认安装的 VS Code 扩展,并在容器创建后运行命令(见图13.10):

有关如何自定义 devcontainer.json
文件的完整参考,请参见 https://code.visualstudio.com/docs/remote/devcontainerjsonreference。
如果你修改了 Dockerfile
文件或 devcontainer.json
文件,可以通过打开命令面板并执行“重建容器”来重建容器。
如果你需要在 codespace 中使用密钥,你可以像在其他地方一样,在组织或仓库级别的 “Settings | Secrets | Codespaces” 下创建它们。密钥将作为环境变量提供给容器中的代码空间。如果你添加了新密钥,你需要停止当前的 codespace,重建容器是不够的。
当然,GitHub Codespaces 不是免费的——你需要为实例的运行时间支付费用。每月按天结算费用,费用依据虚拟机的规格(见表13.1):

此外,你还需要支付每 GB 每月 $0.07 的存储费用。
如果你关闭浏览器,codespaces 不会终止。如果它们仍在后台运行,你可以更快速地连接,但你仍然需要为它们支付费用。默认的空闲超时是 30 分钟,相当于 4 核机器每月 $0.18。虽然这非常便宜,但仍然是费用。你应该始终停止不再需要的 codespace。你可以在 “设置 | Codespaces” 中更改默认的空闲超时设置。
GitHub Codespaces 不仅对安全有好处,它还可以提高你的入职时间和生产力。GitHub 本身就使用它来开发,减少了新工程师的入职时间,从几天缩短到了不到 10 秒!这对于一个通常需要 20 分钟来克隆的 13GB 大小的仓库来说是一个显著的提升(Cory Wilkerson,2021年)。
GitHub Codespaces 可能并不适用于所有产品,但对于 Web 应用程序来说,它是未来,并将彻底改变我们对开发者机器管理的看法。它还帮助你弥补开发管道中的一个安全漏洞——本地开发者机器。