Terragrunt 官方文档站点开发指南:基于 Astro Starlight 的本地构建与 Vercel 部署
2026/9/15 21:10:16 网站建设 项目流程

Terragrunt 官方文档站点开发指南:基于 Astro Starlight 的本地构建与 Vercel 部署

【免费下载链接】terragruntTerragrunt is a flexible orchestration tool that allows Infrastructure as Code written in OpenTofu/Terraform to scale.项目地址: https://gitcode.com/GitHub_Trending/te/terragrunt

Terragrunt 是一个让基于 OpenTofu/Terraform 编写的基础设施即代码(IaC)能够规模化编排的灵活工具。本文聚焦于其仓库内docs子项目:Terragrunt 官方文档网站(托管于 docs.terragrunt.com)的本地开发、生产构建与部署全流程。读完本文,你将掌握如何使用 mise 与 Bun 一键搭建文档开发环境、启动带热重载的开发服务器、执行带拼写检查与链接校验的生产构建,并理解基于 Vercel 的自动部署与预览部署机制,以及构建管线中各脚本与配置的源码级细节。

Terragrunt 文档仓库概览

Terragrunt 官方文档并非与主程序代码混在一起,而是作为一个独立的静态站点工程,位于仓库的 docs 目录中。它使用 Starlight(Astro 生态的文档站点框架)构建,工程自身包含完整的package.jsonastro.config.mjsvercel.json、Tailwind 与 TypeScript 配置,可以独立安装依赖、独立构建、独立部署。

从目录结构看,文档工程主要由以下几部分组成:

  • docs/package.json:NPM 脚本与依赖清单,使用 Bun 作为包管理器与运行时;
  • docs/astro.config.mjs:Astro/Starlight 核心配置,含站点元信息、侧边栏、各类集成插件与大量重定向规则;
  • docs/vercel.json:Vercel 平台专属的构建命令、重写、重定向与响应头配置;
  • docs/src/content:文档正文内容(大量.mdx/.md文件);
  • docs/src/data:命令、标志位、FAQ、Changelog、实验特性等结构化数据集合(以.mdx为主);
  • docs/scripts/indexnow-ping.js:生产构建后向 IndexNow 推送 URL 的脚本;
  • docs/tests/install_test.sh:对安装脚本的测试套件;
  • docs/public/llms.txt:面向 LLM/Agent 的手工维护的文档索引。

开发环境准备:mise 统一工具链

文档站点开发的第一步是安装运行所需工具链。仓库使用 mise(一个通用的开发工具版本管理器)来锁定工具版本,保证所有开发者、CI 与本地环境使用一致的版本。

安装工具版本

在项目根目录执行:

mise install

mise 会根据仓库根目录下的 mise.toml 中声明的[tools]自动下载并安装指定版本的工具。从该文件可以看到 Terragrunt 仓库为整个项目(包括 docs 子工程)锁定的关键工具版本:

  • bun = "1.4.0":包管理器与脚本运行时,docs 工程的所有命令都依赖它;
  • go = "1.27.0"opentofu = "1.12.2":Terragrunt 主程序与 OpenTofu 的版本;
  • codespell = "2.4.1"(通过 pipx 安装):构建阶段的拼写检查器;
  • 以及golangci-lintshellcheckshfmtpre-commit等静态检查工具。

对于只开发文档的场景,最关键的其实是buncodespell两个工具:前者驱动所有 NPM 脚本,后者在构建前执行拼写检查。

安装 NPM 依赖

工具链就绪后,进入docs目录安装前端依赖:

cd docs bun i

依赖安装使用 Bun 而非 npm/yarn,安装记录锁定在 docs/bun.lock 中。核心依赖包括astro(7.x)、@astrojs/starlight(0.41.x)、@astrojs/vercel(Vercel 适配器)、@astrojs/sitemap(站点地图生成)、astro-d2(D2 图表渲染)、starlight-links-validator(链接校验)与starlight-llms-txt(LLM 友好文本生成)等。

安装 d2 图表构建工具

文档中包含若干用 d2(一种声明式图表语言)绘制的架构图。这些图在本地构建时需要由d2命令行工具编译为 SVG,因此需要额外安装 d2。这一需求同样体现在 docs/astro.config.mjs 中对astro-d2集成的配置上:集成在本地构建时执行图表生成(skipGenerationfalse),而在 Vercel 环境(存在VERCEL环境变量)下则跳过生成——这是因为官方建议在本地生成图表后再提交,避免在构建平台上运行非信任代码(详见配置中的注释)。

本地开发:启动热重载文档服务器

完成依赖安装后,即可启动本地开发服务器:

bun dev

该命令实际执行的是astro dev(见 docs/package.json 的dev/start脚本)。服务器默认监听 http://127.0.0.1:4321,并且在你修改任何文档内容时自动热重载(HMR),无需手动刷新或重启。

本地开发模式下还有几个值得注意的行为:

  • 根路径/会被重定向到/getting-started/quick-start/,方便直接进入核心教程;
  • 历史遗留的/docs/*路径会被重定向到新的/结构(例如/docs//getting-started/quick-start/),这些重定向规则同时定义在 docs/astro.config.mjs 的redirects字段与 docs/vercel.json 中(Astro 侧负责astro dev时的行为,Vercel 侧负责线上行为);
  • 大量旧版文档路径(如/reference/configuration//features/inputs/)也配置了到新结构的一一映射,保证老链接不失效。

生产构建:带检查的静态生成

当文档内容准备就绪、需要验证能否正常产出时,执行生产构建:

bun run build

从 docs/package.json 可以看到,build脚本是astro build && bun scripts/indexnow-ping.js的组合命令,并且配置了prebuild钩子。整个构建流程分三个阶段:

  1. 拼写检查(prebuild):如果系统 PATH 中存在codespell,则先对仓库根目录执行codespell全文拼写检查(可通过bun run spell/bun run spell:fix手动触发或自动修复);若未安装则跳过并给出提示。这一设计保证了文档在发布前没有明显的拼写错误。

  2. Astro 静态构建(astro build):生成站点产物到dist目录。构建过程会执行额外的检查——例如 docs/astro.config.mjs 中集成的starlight-links-validator会在构建期校验所有站内链接是否有效,失效链接会导致构建失败。这也是本地执行构建的一个重要价值:当 CI 构建失败时,可以本地复现并定位是哪个链接或配置出了问题。

  3. IndexNow 推送(indexnow-ping.js):构建完成后执行 docs/scripts/indexnow-ping.js,将站点地图中的所有 URL 分批(每批 10000 条)提交给 IndexNow 搜索引擎协议,加速新内容被搜索引擎收录。

IndexNow 脚本的行为细节

indexnow-ping.js是一个典型的"尽力而为"(best-effort)脚本:

  • 仅当VERCEL_ENV=production时才会真正执行;其他环境直接打印跳过日志,不会报错;
  • .vercel/output/static(Vercel 构建产物)或dist/client(本地 Node 适配器产物)中扫描sitemap-*.xml分片,提取其中指向 docs.terragrunt.com 的 URL;
  • 使用仓库中已有的密钥文件7a409eaf64d4ae9f009a70196fd234cd.txt(位于 docs/public)向 IndexNow API 提交,任何网络或响应错误都会被捕获并仅记录日志,绝不阻断构建。

部署与托管:Vercel 自动部署与预览

文档站点的托管与部署完全自动化:

  • 生产环境:每当有新提交推送到仓库的main分支,Vercel 会自动构建并部署到生产环境(docs.terragrunt.com);
  • 预览环境:每一个 Pull Request 都会触发一次预览部署。为防止在 Vercel 构建中运行不可信代码,预览站点仅对项目维护者可见(见 docs/README.md 的 Hosting 一节)。

Vercel 侧的行为由 docs/vercel.json 控制,其中的关键配置包括:

  • 构建与安装命令buildCommandbunx bun@1.4.0 run buildinstallCommandbunx bun@1.4.0 install,框架识别为astro,并开启trailingSlash
  • 重写规则(rewrites):将/api/v1/compatibilitytool=opentofu/terraform查询参数分别路由到对应端点;将/mtag/*/vtag/*/htag/*代理到 Google Tag Manager、Vector 与 HubSpot 等第三方脚本源,用于规避 Partytown 工作线程中的跨域 CORS 限制;
  • 重定向规则(redirects):将/docs/(.*)永久重定向到/$1(与 Astro 侧配合,深度路径由 Vercel 处理),并处理/lp/*/contact-tgs/*等营销落地页跳转;
  • 响应头(headers):为 Pagefind 搜索资源配置跨域头,并为llms.txtllms-small.txtllms-full.txt三个文件设置X-Robots-Tag: noindex,避免 LLM 索引文件被搜索引擎重复收录。

构建管线的源码级细节

Astro/Starlight 配置核心

docs/astro.config.mjs 是整个文档站的中枢配置,值得关注的点包括:

  • 适配器切换:根据是否存在VERCEL环境变量,在 Vercel 适配器(启用 ISR,缓存 24 小时)与 Node 独立模式适配器之间切换,因此同一份配置既能在本地以 Node 方式运行,也能在 Vercel 上以 Serverless 方式运行;
  • Starlight 集成:站点标题、描述("Terragrunt is a flexible orchestration tool that allows Infrastructure as Code written in OpenTofu/Terraform to scale.")、自定义头部组件(Header/PageSidebar/SiteTitle/SkipLink)、明暗两套 Logo、Kapa AI 文档问答小组件与 Discord 社交链接均在starlight()中声明;
  • 插件组合starlight-links-validator负责链接校验(并对 OpenTelemetry 本地调试地址、动态生成的 CLI 命令页锚点、实验特性页等做了针对性排除);starlight-llms-txt生成/llms-full.txt/llms-small.txt
  • LLM 索引定制:配置中通过包装starlight-llms-txt插件,拦截其注入的/llms.txt路由,将其替换为 docs/public/llms.txt 这份手工维护的索引——因为它比插件自动生成的模板更能准确反映文档结构,且按 Getting Started / Features / Guides / Reference / Terragrunt Scale 等板块组织,便于 LLM 与 Agent 快速定位内容;
  • 其他集成astro-d2(图表)、partytown(将 Google Tag Manager 等脚本移入 Web Worker 以提升性能,并对不发送 CORS 头的脚本源做了同源代理改写)、sitemap(刻意省略 changefreq/priority/lastmod,因为搜索引擎会忽略或视为噪音)。

内容集合(Collections)结构

文档内容由 docs/src/content.config.ts 定义的类型化集合驱动,共注册了 9 个集合:

  • docs:核心文档正文,使用 Starlight 的docsLoader,并扩展了全站 Banner(当前提示 Terragrunt v1.0 发布);
  • commands/flags:CLI 命令与全局标志位数据(存放在 docs/src/data 下),命令页由src/pages/reference/cli/commands/[...slug].astro动态组装;
  • faqpatternschangelogcompatibilityexperimentsstrictControls:FAQ 问答、最佳实践模式、版本变更日志、OpenTofu/Terraform 兼容性矩阵、实验特性与严格控制项。

所有集合都带有 Zod schema 校验,意味着内容字段缺失或类型错误会在构建期直接报错,从数据层面保证了文档的规范性。

本地复现 CI 构建失败

由于 docs/README.md 明确提到"本地运行构建有助于定位 CI 中的构建失败",一个推荐的排查流程是:

mise install # 准备工具链(含 codespell) cd docs bun i # 安装依赖 bun run build # 本地完整构建:拼写检查 + astro build + IndexNow(no-op)

如果本地构建通过而 CI 失败,通常可以缩小范围到:Vercel 特有的环境差异(如VERCEL环境变量导致适配器切换、预览部署的权限限制)、bun.lock与本地依赖不一致,或indexnow-ping.js在生产环境下的网络行为。整个 docs 工程还配有 docs/tests/install_test.sh 测试套件(覆盖安装脚本的语法、参数互斥、校验与平台兼容性等,可用./install_test.sh全量运行或--quick跳过联网用例),可作为文档工程质量保障的补充参考。

小结

Terragrunt 的官方文档站是一个独立的 Astro Starlight 工程:开发侧通过mise统一工具版本、bun i安装依赖、bun dev热重载预览;质量侧通过构建期的 codespell 拼写检查与链接校验把关;发布侧则由 Vercel 接管生产与预览部署,配合重写/重定向规则、IndexNow 推送与 LLM 友好索引,形成一套完整、自动化的文档发布流水线。理解这些配置与脚本,无论是为文档贡献内容,还是复现构建问题,都能做到有的放矢。

【免费下载链接】terragruntTerragrunt is a flexible orchestration tool that allows Infrastructure as Code written in OpenTofu/Terraform to scale.项目地址: https://gitcode.com/GitHub_Trending/te/terragrunt

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询