Hugo 自动化部署实战-部署 Hugo 到 Netlify
本文将详细指导你如何设置 GitHub Actions,以实现 Hugo 静态网站的自动化构建,并将其部署到 Netlify。我们将采用一种安全且易于管理的方式,通过一个集中的、以 JSON 格式存储的 GitHub Secret 来管理 Netlify 的部署凭据。
概述:Hugo 到 Netlify 的自动化部署流程
我们将通过以下步骤完成部署流程的搭建:
- 前置准备: 确保拥有必要的账户和工具。
- Netlify 平台配置: 在 Netlify 上创建并配置目标站点,获取部署所需的 API 凭据。
- GitHub Secrets 配置: 安全地存储 Netlify 的认证令牌和站点 ID。
- 创建 GitHub Actions 工作流: 编写 YAML 文件定义构建和部署的具体步骤。
- 执行与验证: 提交代码触发工作流,并验证部署结果。
1. 前置准备
开始之前,请确保你已具备:
- GitHub 账户及仓库: 你的 Hugo 项目代码应托管在 GitHub 上。
- Netlify 账户: 用于托管你的静态站点 (netlify.com)。
- Node.js 和 npm/yarn: Netlify CLI (将在 GitHub Actions 中使用) 是一个 Node.js 包。建议本地也安装 Node.js (nodejs.org)。
- Hugo (本地安装): 用于本地开发、构建和测试你的 Hugo 站点 (gohugo.io/installation)。如果你的主题或内容使用 SASS/SCSS, 请确保安装 Hugo 的 extended 版本。
2. Netlify 平台配置
在我们可以通过 GitHub Actions 部署之前,需要在 Netlify 上进行一些设置。
2.1. 在 Netlify 创建站点
- 登录 Netlify: 访问 app.netlify.com。
- 导入项目创建站点:
- 从你的团队仪表板,点击 “Add new site” -> “Import an existing project”。
- 选择 “GitHub” 作为你的 Git 提供商。
- 授权 Netlify 访问你的 GitHub 账户并选择你的 Hugo 项目仓库。
- 配置初始构建设置 (稍后将由 Actions 控制):
- Netlify 可能会尝试自动检测项目类型。
- 对于 “Build command” 和 “Publish directory”,你可以暂时接受其建议 (例如
hugo
和public
) 或留空。 - 点击 “Deploy site”。Netlify 可能会进行一次初始部署。
- 关键步骤:禁用 Netlify 的自动构建: 由于我们将使用 GitHub Actions 进行构建和部署,我们需要阻止 Netlify 在每次 Git 推送时自动构建。
- 导航到你新创建的 Netlify 站点。
- 进入 “Site configuration” (或 “Site settings”) -> “Build & deploy”。
- 在 “Continuous Deployment” -> “Builds” 部分,点击 “Edit settings” 并选择 “Stop builds”。
- 保存更改。这将确保只有我们的 GitHub Action 会触发部署。
2.2. 获取 Netlify API 凭据
为了让 GitHub Actions 能够代表你部署到 Netlify,你需要两项凭据:
-
A. Netlify 个人访问令牌 (Personal Access Token - PAT):
- 在 Netlify UI 中,点击右上角你的用户头像,然后选择 “User settings”。
- 在左侧导航栏中,选择 “Applications”。
- 向下滚动到 “Personal access tokens” 部分,点击 “New access token”。
- 为该 Token 提供一个描述性的名称,例如
GitHub Actions Hugo Deployer
。 - 点击 “Generate token”。
- 立即复制生成的 Token。它只显示一次。请将其安全保存,稍后将添加到 GitHub Secrets。
-
B. Netlify 站点 ID (API ID):
此 ID 唯一标识了你在 Netlify 上的目标部署站点。- 导航到你在 Netlify 上的目标 Hugo 站点。
- 进入站点的 “Site configuration” (或 “Site settings”)。
- 在 “Site details” (或 “General” -> “Site details”) 部分,找到并复制 “API ID” 的值。
3. GitHub Secrets 配置
我们将把获取到的 Netlify 凭据安全地存储在一个名为 DEPLOY_SECRETS_JSON
的 GitHub Secret 中。这种方式便于集中管理多个平台的部署凭据。
- 导航到你的 Hugo 项目的 GitHub 仓库页面。
- 点击 “Settings” -> “Secrets and variables” -> “Actions”。
- 更新或创建
DEPLOY_SECRETS_JSON
Secret:- 如果这个 Secret 已存在(例如,你已为 Vercel 配置过),点击 “Update”。
- 如果不存在,点击 “New repository secret”。
- 设置 Secret 内容:
- Name:
DEPLOY_SECRETS_JSON
- Value: 粘贴或更新以下 JSON 结构。将
YOUR_...
占位符替换为你在步骤 2.2 中获取到的实际 Netlify 凭据。如果已有其他平台的凭据,请保留它们并添加netlify
部分。
确保整个内容是一个有效的 JSON 字符串。{"vercel": {// ... Vercel 凭据 (如果已配置) ...},"netlify": {"netlify_auth_token": "YOUR_NETLIFY_PERSONAL_ACCESS_TOKEN","netlify_site_id": "YOUR_NETLIFY_API_ID"}// 未来可以添加其他平台的凭据 }
- Name:
- 点击 “Save secret” (或 “Update secret”)。
4. 创建 GitHub Actions 工作流
接下来,我们将编写或更新 GitHub Actions 工作流文件 (.github/workflows/deploy-hugo-site.yml
),使其包含构建 Hugo 站点并将结果部署到 Netlify 的步骤。
.github/workflows/deploy-hugo-site.yml
内容示例:
name: Build Hugo Site & Deployon:push:branches:- main # 触发部署的主分支workflow_dispatch: # 允许手动触发jobs:# Job 1: 构建 Hugo 站点build:name: Build Hugo siteruns-on: ubuntu-latestpermissions:contents: read # 工作流读取仓库内容的权限steps:- name: Checkout repository codeuses: actions/checkout@v4with:submodules: recursive # 拉取 Git Submodules (例如 Hugo 主题)fetch-depth: 0 # 拉取所有 Git 历史 (Hugo 可能需要)- name: Setup Hugo CLIuses: peaceiris/actions-hugo@v2with:hugo-version: 'latest' # 或指定具体版本, e.g., '0.123.7'extended: true # 如果使用 SASS/SCSS 则需要- name: Build Hugo siterun: hugo --minify # 生成静态站点到 ./public 目录- name: Upload build artifactuses: actions/upload-artifact@v4with:name: hugo-build-output # 构建产物的名称path: public/ # 上传 ./public 目录内容if-no-files-found: errorretention-days: 1# Job 2: 部署到 Netlifydeploy_netlify:name: Deploy to Netlifyneeds: build # 依赖于 'build' job 的成功完成runs-on: ubuntu-latest# if: github.ref == 'refs/heads/main' # 可选: 仅在主分支推送时部署到 Netlifyenv:# 从 GitHub Secrets 中解析 Netlify 凭据NETLIFY_AUTH_TOKEN: ${{ fromJson(secrets.DEPLOY_SECRETS_JSON).netlify.netlify_auth_token }}NETLIFY_SITE_ID: ${{ fromJson(secrets.DEPLOY_SECRETS_JSON).netlify.netlify_site_id }}steps:- name: Download build artifactuses: actions/download-artifact@v4with:name: hugo-build-output # 与上传时名称一致path: ./deploy_dir # 下载到指定目录- name: Setup Node.js for Netlify CLIuses: actions/setup-node@v4with:node-version: '20' # 使用一个兼容的 Node.js 版本- name: Install Netlify CLIrun: npm install --global netlify-cli@latest- name: Deploy to Netlifyrun: |echo "Deploying to Netlify Site ID: $NETLIFY_SITE_ID"# 使用 Netlify CLI 部署# '--dir' 指定包含已构建站点的目录# '--prod' 将部署发布到生产环境# Netlify CLI 会自动使用 NETLIFY_AUTH_TOKEN 和 NETLIFY_SITE_ID 环境变量netlify deploy --dir=./deploy_dir --prod --message "Deploy from GitHub Actions [${{ github.sha }}]"
工作流关键部分解释:
build
Job:- 检出代码,设置 Hugo,运行
hugo --minify
构建站点。 - 将构建输出 (
public/
目录) 上传为名为hugo-build-output
的 artifact。
- 检出代码,设置 Hugo,运行
deploy_netlify
Job:needs: build
: 确保在build
job 成功后运行。env
: 使用fromJson()
函数从DEPLOY_SECRETS_JSON
Secret 中提取 Netlify 的auth_token
和site_id
,并设置到环境变量NETLIFY_AUTH_TOKEN
和NETLIFY_SITE_ID
。Netlify CLI 会自动识别这些环境变量。Download build artifact
: 下载之前build
job 上传的hugo-build-output
到./deploy_dir
。Setup Node.js
和Install Netlify CLI
: 准备运行 Netlify CLI 的环境。Deploy to Netlify
: 执行netlify deploy
命令。--dir=./deploy_dir
: 告诉 Netlify CLI 部署./deploy_dir
目录中的内容。--prod
: 将此部署标记为生产部署,更新主域名。--message "..."
: (可选) 在 Netlify 的部署历史中添加一条自定义消息,这里包含了触发部署的 Git commit SHA,方便追溯。
5. 执行与验证
5.1. 提交工作流文件
- 将对
.github/workflows/deploy-hugo-site.yml
的修改保存到你的本地仓库。 - 提交并推送到 GitHub 上的
main
(或你的主) 分支:git add .github/workflows/deploy-hugo-site.yml git commit -m "ci: Add Netlify deployment job" git push origin main
5.2. 监控 GitHub Actions
- 推送后,访问你的 GitHub 仓库的 “Actions” 标签页。
- 你应该会看到名为 “Build Hugo Site & Deploy” 的工作流正在运行。
- 点击该运行实例,可以查看
build
和deploy_netlify
job 的日志。确保deploy_netlify
job 中的所有步骤都成功执行。
5.3. 验证 Netlify 部署
- 当
deploy_netlify
job 成功完成后,其日志输出通常会包含一个指向你已部署站点的 URL (例如Live URL: https://your-site-name.netlify.app
)。 - 同时,你也可以直接访问你在 Netlify UI 中看到的该站点的生产 URL。
- 在浏览器中打开此 URL,验证你的 Hugo 站点是否已成功部署到 Netlify,并且所有内容和功能都按预期工作。
- 你也可以在 Netlify 站点的 “Deploys” 部分查看部署历史和相关的部署日志。
6. 故障排除与最佳实践 (Netlify 相关)
(这一部分可以根据实际遇到的问题和 Netlify 的特性进行补充,例如)
- 认证问题: 仔细核对
NETLIFY_AUTH_TOKEN
和NETLIFY_SITE_ID
的正确性及其在DEPLOY_SECRETS_JSON
中的路径。 - 部署目录: 确保
netlify deploy --dir
参数指向的目录确实是包含index.html
等所有静态资源的根目录。 - Netlify 构建设置: 再次确认 Netlify 站点的自动构建已禁用 (“Stop builds”)。
- Netlify 特有文件: 如果你使用
_redirects
,_headers
, 或netlify.toml
(用于 Netlify Functions, Build Plugins 等),确保这些文件被正确包含在 Hugo 构建的输出目录 (即上传到 artifact 并最终部署的目录) 的根级别。
通过本教程,你已经学会了如何扩展你的 GitHub Actions 工作流,以支持将 Hugo 站点部署到 Netlify,同时保持了凭据管理的集中性和安全性。