Hugo 自动化部署实战-部署 Hugo 到 Vercel
欢迎来到 Hugo 自动化部署实战系列教程!在本系列中,我们将逐步探索如何使用 GitHub Actions 将你的 Hugo 静态网站自动化部署到各种流行的托管平台。
本篇作为系列的第一部分,将详细指导你如何设置 GitHub Actions 工作流,以自动化构建你的 Hugo 站点并将其部署到 Vercel。我们将特别关注一种安全且易于管理的凭据管理方式——通过一个集中的 JSON 格式的 GitHub Secret。
后续教程将涵盖部署到 GitHub Pages, Netlify, Cloudflare Pages, 和 Firebase Hosting。
概述:Vercel 部署流程
对于 Vercel 部署,我们将遵循以下主要步骤:
- 前置准备: 确保你拥有必要的账户和工具。
- 项目设置: 确认你的 Hugo 项目结构。
- Vercel 配置: 设置 Vercel 项目并获取部署所需的凭据。
- GitHub Secrets 配置: 安全地存储 Vercel 凭据在一个集中的 JSON 对象中。
- 创建 GitHub Actions 工作流: 定义自动化构建和部署到 Vercel 的流程。
- 提交、测试和验证: 触发部署并检查结果。
1. 前置准备
在开始之前,请确保你已准备好以下各项:
- 1.1. GitHub 账户和仓库: 你的 Hugo 项目代码应托管在 GitHub 仓库中。
- 1.2. Vercel 账户: 你需要一个 Vercel 账户 (vercel.com) 来托管你的静态站点。
- 1.3. Node.js 和 npm/yarn: Vercel CLI 是一个 Node.js 包,它将在 GitHub Actions 环境中被用于部署。本地安装 Node.js (nodejs.org) 也有助于进行一些本地 CLI 操作。
- 1.4. Hugo 安装 (本地): 在本地安装 Hugo (gohugo.io/installation),以便能够本地开发和测试你的站点。如果你的主题或内容使用了 SASS/SCSS,请确保安装 Hugo 的 extended 版本。
2. 项目设置 (你的 Hugo 站点)
本教程假设你已经有一个正在运行的 Hugo 项目。
- 2.1. Hugo 项目初始化: 如果你从头开始,可以使用
hugo new site <site-name>
。 - 2.2. 主题集成: 确保你的 Hugo 主题已正确安装和配置在你的项目中。
在本地运行 hugo server
,确认你的 Hugo 站点能够正常构建和预览。
3. Vercel 配置
我们需要在 Vercel 上设置一个项目来接收我们的部署,并获取部署所需的 API 凭据。
3.1. 创建或选择 Vercel 项目
- 登录到你的 Vercel 账户。
- 点击仪表板上的 “Add New…” -> “Project”。
- 选择 “Continue with Git Repository”,然后从列表中选择你的 Hugo 项目所在的 GitHub 仓库。
- Vercel 可能会尝试自动检测框架并配置构建设置。你可以暂时接受默认设置,因为我们稍后会在 Vercel 项目设置中禁用其自动构建,以便让 GitHub Actions 完全控制。
- 完成项目的导入。
3.2. 获取 Vercel API Token, Project ID, 和 Org ID
这些凭据对于 GitHub Actions 以编程方式与 Vercel API 交互至关重要。
-
VERCEL_TOKEN
(Access Token):- 在 Vercel Dashboard,点击右上角你的头像,然后选择 “Settings”。
- 在左侧导航栏中,选择 “Tokens”。
- 点击 “Create” 按钮。
- 为你的 Token 指定一个描述性名称,例如
GitHub Actions - Hugo Vercel Deploy
。 - 选择 Token 的范围 (Scope)。通常,这会是你的个人账户或你希望部署到的特定 Vercel Team。
- (可选但推荐)设置一个过期日期。
- 点击 “Create Token”。重要:立即复制生成的 Token 值。它只显示一次。请将其安全保存,稍后会用到。
-
VERCEL_ORG_ID
和VERCEL_PROJECT_ID
(推荐使用 Vercel CLI):
使用 Vercel CLI 是获取与特定项目关联的orgId
和projectId
的最可靠方法。- 安装 Vercel CLI (如果尚未安装):
npm install -g vercel
- 登录 Vercel CLI: 在你的终端运行:
按照提示在浏览器中完成授权。vercel login
- 链接本地项目到 Vercel 项目: 在你的本地 Hugo 项目的根目录下,运行:
CLI 将引导你:cd path/to/your/hugo-site # 替换为你的项目路径 vercel link
- 确认设置当前目录。
- 选择你的 Vercel scope (这将是你的
orgId
所属的个人账户或团队)。 - 选择链接到你在 Vercel UI 上为该 Hugo 项目创建的现有项目(或让 CLI 为你创建一个新项目)。
- 查看生成的配置: 成功链接后,Vercel CLI 会在你的项目根目录下创建
.vercel/project.json
文件。打开此文件,其内容将类似:
从这个文件中复制{"orgId": "team_xxxxxxxxxxxxxxxxx", // 或你的用户 ID"projectId": "prj_yyyyyyyyyyyyyyyyy" }
orgId
(作为VERCEL_ORG_ID
) 和projectId
(作为VERCEL_PROJECT_ID
) 的值。
- 安装 Vercel CLI (如果尚未安装):
3.3. 配置 Vercel 项目以跳过其自身构建
由于我们将使用 GitHub Actions 来构建我们的 Hugo 站点,我们需要告诉 Vercel 不要尝试自行构建。
- 在 Vercel Dashboard,导航到你为本文档站点设置的 Vercel Project。
- 点击 “Settings” 标签页,然后选择 “Build & Development Settings” 部分。
- 找到 “Build Command” 字段,将其清空,或者设置为一个无害的命令,例如
echo "Site is prebuilt and deployed by GitHub Actions"
。 - “Output Directory” 字段可以保持为 Hugo 的默认
public
,或者如果构建命令已清空,此设置影响不大。 - “Install Command” 字段也可以清空。
- 点击页面底部的 “Save” 按钮。
此设置可确保 Vercel 不会因 Git 推送而触发自动构建,而是等待我们的 GitHub Action 通过 API 进行部署。
4. GitHub Secrets 配置
为了安全地在 GitHub Actions 中使用部署凭据,我们将它们存储在一个名为 DEPLOY_SECRETS_JSON
的 GitHub Secret 中。这个 Secret 将包含一个 JSON 字符串,其中包含所有目标平台(目前是 Vercel)的必要信息。
- 导航到你的 Hugo 项目的 GitHub 仓库页面。
- 点击仓库顶部的 “Settings” 标签页。
- 在左侧菜单中,向下滚动到 “Security” 部分,然后点击 “Secrets and variables” -> “Actions”。
- 在 “Repository secrets” 部分,点击 “New repository secret” 按钮。
- 创建 Secret:
- Name:
DEPLOY_SECRETS_JSON
- Secret (Value): 粘贴以下 JSON 结构。请务必将
YOUR_...
占位符替换为你在步骤 3.2 中获取到的实际 Vercel 凭据。 随着系列教程的进行,我们将向此 JSON 对象添加其他平台的凭据。
重要提示: 确保粘贴的值是一个有效的 JSON 格式字符串。你可以使用在线 JSON 验证工具来检查其正确性。{"vercel": {"vercel_token": "YOUR_COPIED_VERCEL_ACCESS_TOKEN","vercel_projectId": "YOUR_VERCEL_PROJECT_ID","vercel_orgId": "YOUR_VERCEL_ORG_ID"}// 未来可以添加 "netlify", "cloudflare_pages", "firebase" 等键 }
- Name:
- 点击 “Add secret”。
5. 创建 GitHub Actions 工作流
现在,我们将编写一个 GitHub Actions 工作流(YAML 文件),它将定义自动化构建和部署到 Vercel 的整个流程。
在你的 Hugo 项目的根目录下,创建 .github/workflows/
文件夹(如果它尚不存在)。在此文件夹中,创建一个新的 YAML 文件,例如 deploy-hugo-site.yml
(一个通用的文件名,因为将来可能会扩展到部署到多个平台)。
将以下内容粘贴到 deploy-hugo-site.yml
文件中:
name: Build Hugo Site & Deploy# 工作流触发器:何时运行此工作流
on:push:branches:- main # 当代码推送到 main 分支时触发 (根据你的主分支名称调整)workflow_dispatch: # 允许从 GitHub UI 手动触发此工作流jobs:# Build Job: 负责构建 Hugo 站点build:name: Build Hugo siteruns-on: ubuntu-latest # 在最新的 Ubuntu 虚拟机上运行permissions:contents: read # 授予读取仓库内容的权限steps:# 步骤 1: 检出仓库代码- name: Checkout repository codeuses: actions/checkout@v4with:submodules: recursive # 如果你的主题是 Git Submodule,则递归拉取fetch-depth: 0 # Hugo 可能需要完整的历史记录来获取 .Lastmod 等信息# 步骤 2: 安装和设置 Hugo CLI- name: Setup Hugo CLIuses: peaceiris/actions-hugo@v2with:hugo-version: 'latest' # 使用最新版 Hugo,或指定特定版本如 '0.123.7'extended: true # 确保安装 Hugo extended 版本 (如果主题使用 SASS/SCSS)# 步骤 3: 运行 Hugo 构建命令- name: Build Hugo siterun: hugo --minify # --minify 是可选的,用于压缩输出文件# 步骤 4: 上传构建产物 (public 目录)- name: Upload build artifact (public directory)uses: actions/upload-artifact@v4with:name: hugo-build # Artifact 的名称,将在 deploy job 中使用path: public/ # 要上传的 Hugo 输出目录if-no-files-found: error # 如果 public 目录为空或不存在,则使步骤失败retention-days: 1 # (可选)保留 artifact 的天数# Deploy to Vercel Job: 负责将构建好的站点部署到 Verceldeploy_vercel:name: Deploy to Vercelif: github.event_name == 'push' || github.event_name == 'workflow_dispatch' # 仅在 push 或手动触发时运行 (可根据需要调整)needs: build # 此 job 依赖于 'build' job 的成功完成runs-on: ubuntu-latestpermissions:contents: read # 通常部署步骤不需要写权限# 设置环境变量,从 DEPLOY_SECRETS_JSON 解析 Vercel 凭据env:VERCEL_TOKEN: ${{ fromJson(secrets.DEPLOY_SECRETS_JSON).vercel.vercel_token }}VERCEL_PROJECT_ID: ${{ fromJson(secrets.DEPLOY_SECRETS_JSON).vercel.vercel_projectId }}VERCEL_ORG_ID: ${{ fromJson(secrets.DEPLOY_SECRETS_JSON).vercel.vercel_orgId }}steps:# 步骤 1: 下载之前构建的 artifact- name: Download build artifactuses: actions/download-artifact@v4with:name: hugo-build # 必须与 build job 中 upload-artifact 的 name 一致path: ./site-to-deploy # 将 artifact 下载到当前工作目录下的 ./site-to-deploy 文件夹# 步骤 2: 安装 Node.js (Vercel CLI 需要)- name: Setup Node.js (for Vercel CLI)uses: actions/setup-node@v4with:node-version: '20' # 选择一个与 Vercel CLI 兼容的 Node.js LTS 版本# 步骤 3: 安装 Vercel CLI- name: Install Vercel CLIrun: npm install --global vercel@latest # 安装最新稳定版的 Vercel CLI# 步骤 4: 执行部署命令- name: Deploy to Vercel Productionrun: |echo "Deploying to Vercel Project: $VERCEL_PROJECT_ID under Org/User: $VERCEL_ORG_ID"# Vercel CLI 会自动使用上面通过 'env' 设置的 VERCEL_TOKEN, VERCEL_PROJECT_ID, VERCEL_ORG_ID# 我们直接部署从 artifact 下载的 ./site-to-deploy 目录# '--prod' 标志用于部署到生产环境的 URL# '--yes' 自动确认所有提示,适用于 CI 环境# '--token' 和 '--scope' 是显式传递,尽管环境变量也应该生效,但显式传递更可靠vercel deploy --prod --yes ./site-to-deploy --token "$VERCEL_TOKEN" --scope "$VERCEL_ORG_ID"
6. 提交、测试和验证
6.1. 提交工作流文件到 GitHub
- 确保你已将新创建的
.github/workflows/deploy-hugo-site.yml
文件保存在你的本地 Hugo 项目中。 - 将此文件添加到 Git 暂存区,提交它,然后推送到你的 GitHub 仓库的
main
(或你的主) 分支:git add .github/workflows/deploy-hugo-site.yml git commit -m "ci: Add GitHub Actions workflow to build Hugo and deploy to Vercel" git push origin main
6.2. 监控 Actions 运行
- 一旦你将更改推送到 GitHub,导航到你的仓库页面。
- 点击顶部的 “Actions” 标签页。
- 你应该会看到一个名为 “Build Hugo Site & Deploy” (或你在 YAML 文件中定义的
name
) 的工作流实例正在运行或已排队。 - 点击该工作流运行实例,你可以查看
build
job 和deploy_vercel
job 的详细日志。 - 仔细检查每个步骤的输出,确保没有报告错误。
6.3. 验证部署
- 当
deploy_vercel
job 成功完成后,其日志输出通常会包含一个指向你已部署站点的生产环境 URL (例如Production: https://your-project-name.vercel.app
)。 - 在你的 Web 浏览器中打开这个 URL。
- 验证你的 Hugo 站点是否已成功部署并且所有内容均按预期显示。
7. 故障排除和最佳实践
- Secrets 问题:
- 如果遇到 Vercel CLI 报告 “No existing credentials found” 或认证失败:
- 仔细检查
DEPLOY_SECRETS_JSON
Secret 的内容。 确保它是一个有效的 JSON 字符串,并且键名 (如vercel
,vercel_token
,vercel_projectId
,vercel_orgId
) 与你在工作流env
部分中用于fromJson()
解析的路径完全匹配。 - 临时调试 (谨慎操作!): 你可以在工作流中临时添加一个步骤来打印环境变量的一部分,以验证 Secret 是否被正确解析和设置 (例如
echo "Token prefix: ${VERCEL_TOKEN:0:5}"
)。重要:调试完成后,务必立即移除这些打印敏感信息的行,并删除包含这些日志的 Actions 运行记录。
- 仔细检查
- 如果遇到 Vercel CLI 报告 “No existing credentials found” 或认证失败:
- Hugo 构建失败:
- 查看 GitHub Actions 中
Build Hugo site
步骤的日志。Hugo 通常会提供关于错误的明确信息,例如模板错误、内容文件问题或配置 (hugo.toml
/config.toml
) 错误。
- 查看 GitHub Actions 中
- Vercel 部署失败:
- 查看
Deploy to Vercel Production
步骤的日志。Vercel CLI 会报告具体的错误信息。 - 常见的可能原因包括:无效的 Vercel Token,不正确的 Project ID 或 Org ID,或者 Vercel 服务端的临时问题。
- 再次确认你已在 Vercel 项目设置中正确清空了 “Build Command”,以防止 Vercel 尝试与 GitHub Actions 同时构建。
- 查看
- Artifact 问题:
- 如果
Download build artifact
步骤失败,请检查build
job 中的Upload build artifact
步骤是否成功完成,并确认 artifact 的name
(在upload-artifact
和download-artifact
中) 是否完全匹配。 - 确保
path
参数在上传和下载时都指向了正确的目录。
- 如果
- 版本固定:
- 为了提高构建的稳定性和可重复性,考虑在工作流文件中为 Actions (如
actions/checkout@v4
,peaceiris/actions-hugo@v2
,actions/setup-node@v4
) 和工具 (如 Hugo 版本hugo-version: '0.123.7'
, Node.js 版本node-version: '20.x'
) 指定更精确的版本号,而不是总是依赖latest
或大版本号。
- 为了提高构建的稳定性和可重复性,考虑在工作流文件中为 Actions (如
- 安全性:
- 定期审查并按需轮换你的 Vercel Access Token。
- 遵循最小权限原则:如果你的 GitHub Actions 工作流只需要读取仓库内容,则在
permissions
块中明确指定contents: read
。
恭喜你完成了本系列教程的第一部分!你现在已经掌握了如何使用 GitHub Actions 和集中的 JSON Secret 将 Hugo 站点部署到 Vercel。
在接下来的教程中,我们将探讨如何将 Hugo 站点部署到其他平台,如 GitHub Pages, Netlify, Cloudflare Pages, 和 Firebase Hosting,并可能复用我们已经建立的 build
流程和 DEPLOY_SECRETS_JSON
结构。