跳转到内容
KN郑某某

Astro 博客 GitHub Actions 自动部署到 GitHub Pages

完整记录如何将 Astro 博客通过 GitHub Actions 自动构建并部署到 GitHub Pages,包括私有仓库源码管理、公开仓库部署、自定义域名配置等全流程。

建站 2 分钟阅读

最近将博客从 VitePress 迁移到了 Astro,并配置了完整的自动化部署流程。这篇文章记录整个部署方案的实现过程。

采用私有仓库管理源码 + 公开仓库部署的分离方案:

┌─────────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 私有仓库 (source) │────▶│ GitHub Actions │────▶│ 公开仓库 (blog) │
│ mechanical-mars │ │ 自动构建部署 │ │ GitHub Pages │
└─────────────────────┘ └──────────────────┘ └─────────────────┘
┌─────────────────┐
│ izqy.top │
│ 自定义域名 │
└─────────────────┘

  1. 源码安全:核心代码和敏感配置存储在私有仓库
  2. 自动化:推送到 main 分支即自动触发构建和部署
  3. 分离清晰:构建产物与源码完全分离
  4. 成本零:完全使用 GitHub 免费服务

源码仓库(私有)

  • 名称:mechanical-mars(或其他你喜欢的名字)
  • 可见性:Private
  • 用途:存储 Astro 源码和配置文件

部署仓库(公开)

  • 名称:blog(或 用户名.github.io
  • 可见性:Public
  • 用途:接收构建产物,开启 GitHub Pages

在本地终端执行:

Terminal window
# 生成 ed25519 密钥对
ssh-keygen -t ed25519 -C "deploy-key" -f deploy_key -N ""
# 查看公钥(添加到 GitHub Deploy keys)
cat deploy_key.pub
# 查看私钥(添加到 GitHub Secrets)
cat deploy_key

私钥内容格式

-----BEGIN OPENSSH PRIVATE KEY-----
xxx...
xxx...
-----END OPENSSH PRIVATE KEY-----

  1. 打开部署仓库(ZhengQinyu/blog
  2. 进入 Settings → Deploy keys
  3. 点击 Add deploy key
  4. Title: GitHub Actions Deploy
  5. Key: 粘贴 deploy_key.pub 的公钥内容
  6. ✅ 勾选 Allow write access
  7. 点击 Add key

在源码仓库创建 .github/workflows/deploy.yml

name: 构建并推送
on:
push:
branches: [main]
workflow_dispatch:
concurrency:
group: pages
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 检出
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: 安装 pnpm
uses: pnpm/action-setup@v3
with:
version: 9
- name: 安装 Node
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- name: 下载依赖
run: pnpm install
- name: 构建
run: pnpm build
env:
SITE_URL: ${{ vars.SITE_URL }}
PUBLIC_GITHUB_HANDLE: ${{ vars.PUBLIC_GITHUB_HANDLE || github.repository_owner }}
PUBLIC_GITHUB_REPO: ${{ vars.PUBLIC_GITHUB_REPO || github.event.repository.name }}
PUBLIC_GISCUS_REPO: ${{ vars.PUBLIC_GISCUS_REPO }}
- name: 添加 .nojekyll 文件
run: touch ./dist/.nojekyll
- name: 部署到公共仓库
uses: peaceiris/actions-gh-pages@v4
with:
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
external_repository: ${{ vars.EXTERNAL_REPOSITORY }}
publish_branch: main
publish_dir: ./dist
force_orphan: true

  1. .nojekyll 文件:必须创建,否则 GitHub Pages 会忽略以下划线开头的目录(如 _astro

  2. force_orphan: true:每次部署都是全新提交,避免历史记录累积

  3. deploy_key:使用 SSH 密钥方式推送,比 GITHUB_TOKEN 更安全可靠

源码仓库mechanical-mars)设置:

NameValue
ACTIONS_DEPLOY_KEYdeploy_key 文件的私钥内容

NameValue说明
EXTERNAL_REPOSITORYZhengQinyu/blog部署目标仓库
SITE_URLhttps://izqy.top站点 URL
PUBLIC_GISCUS_REPOZhengQinyu/blogGiscus 评论仓库(可选)

部署仓库blog)设置:

  1. 进入 Settings → Pages
  2. Source 选择 Deploy from a branch
  3. Branch 选择 main,文件夹 /(root)
  4. Custom domain 填写:izqy.top
  5. ✅ 勾选 Enforce HTTPS
  6. 点击 Save

在你的域名提供商(如阿里云、腾讯云等)添加 CNAME 记录:

类型主机记录记录值
CNAMEblogzhengqinyu.github.io

DNS 生效通常需要 5-30 分钟。首次配置 SSL 证书可能需要 1 小时。

完成以上步骤后:

  1. 向源码仓库推送任意修改
  2. 访问 Actions 页面查看构建状态
  3. 构建成功后,访问 https://izqy.top 查看站点

问题解决方案
_astro 目录 404确认 .nojekyll 文件已创建
部署失败权限错误检查 Deploy Key 是否有写权限
DNS 不生效等待 30 分钟,或使用 dig izqy.top 检查
HTTPS 证书错误等待 1 小时让 GitHub 生成证书

这套方案实现了:

  • ✅ 源码私有,部署公开
  • ✅ 推送即自动部署
  • ✅ 自定义域名 + HTTPS
  • ✅ 零成本(GitHub 免费服务)

适合个人博客、项目文档等静态站点的部署需求。

评论