使用 grunt-gh-pages 自动推送构建目录到 gh-pages 分支

解读

在国内前端工程化面试中,**“一键部署”**是高频考点。面试官问“怎么用 grunt-gh-pages 把 dist 推到 gh-pages”,表面看是插件用法,实则考察三点:

  1. GitHub Pages 国内网络可用性 的落地经验(Gitee Pages、Coding Pages、自建代理);
  2. CI/CD 与 Grunt 生命周期 的整合思路(GitHub Actions、GitLab CI、Jenkins);
  3. 构建产物幂等性、缓存、回滚 的工程意识。
    答得太浅(只背配置)会被追问“网络不通怎么办”“大文件超时如何优化”;答得太深(直接上 Docker 集群)又会被嫌“过度设计”。因此答案要**“刚好能cover国内痛点”**:给出最小可运行配置,再补两道防御性策略,既体现细节掌控,又避免过度工程。

知识点

  • grunt-gh-pages 原理:调用 git 子树 push,把指定目录强行推送到远程 gh-pages 分支,force push 默认 true,会覆盖历史。
  • 国内网络加速:GitHub 443 间歇性超时,需配置 代理变量 GH_TOKEN + proxy: http://127.0.0.1:7890 或走 Gitee 镜像。
  • Token 最小权限:Fine-grained personal access token 只给 contents:writepages:write永不使用个人账户密码
  • 构建幂等:每次构建前 grunt clean,产物目录加 .gitignore 排除 node_modules,防止 node 版本差异 导致 hash 漂移。
  • 缓存策略:GitHub Pages 默认 Cache-Control: 600,对大体积三维模型可在 gh-pages 分支根目录放 _headers 文件自定义缓存。
  • 回滚机制:在 package.json 里预留 "rollback": "git push origin $(git rev-parse HEAD~1):gh-pages --force"一分钟回滚
  • 并行安全:若团队多人同时部署, grunt-gh-pages 无锁,需借助 CI 队列concurrency group 防止竞态。
  • 合规审计:国内公司代码需过 开源扫描,推送前加 grunt-license-finder 任务,确保无 GPL 传染性依赖。

答案

  1. 安装与基础配置
npm i -D grunt-gh-pages

Gruntfile.js 片段:

grunt.loadNpmTasks('grunt-gh-pages');
grunt.initConfig({
  'gh-pages': {
    options: {
      repo: 'https://' + process.env.GH_TOKEN + '@github.com/your-org/your-repo.git',
      branch: 'gh-pages',
      message: 'auto-build: <%= grunt.template.today("yyyy-mm-dd HH:MM:ss") %>',
      dotfiles: true,      // 保留 .nojekyll,防止 GitHub 用 Jekyll 解析
      add: false,          // 先清空再推送,保证纯净
      push: true,
      // 国内代理示例
      git: 'git',
      silent: false,
      logger: function(msg){ grunt.log.writeln(msg); }
    },
    src: ['dist/**/*']
  }
});
  1. 网络容错
    ~/.bashrc 或 CI 里同时配置
export GH_TOKEN=ghp_xxx
export https_proxy=http://127.0.0.1:7890  # clash 本地代理

若仍超时,可改用 Gitee Pages:把 repo 换成 Gitee 地址,并在 Gitee 后台开启 Pages 服务,token 用 Gitee 的私人令牌

  1. 集成到 CI(GitHub Actions 示例)
    .github/workflows/grunt-deploy.yml
name: Grunt Deploy
on:
  push:
    branches: [ main ]
concurrency: gh-pages         # 防止并行
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 18
          cache: 'npm'
      - run: npm ci
      - run: npx grunt build
      - run: npx grunt gh-pages
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}  // 使用官方提供的 GITHUB_TOKEN,无需个人 token
  1. 回滚命令
npm run rollback   // 对应 package.json 脚本,秒级回退到上一版本
  1. 验证
    推送成功后,国内用户访问 https://your-org.github.io/your-repo 若白屏,按 F12 看是否 SSL 证书被公司网关替换,可让运维把域名加入白名单或改用 Gitee Pages 自定义域名备案方案

拓展思考

  • 灰度发布:把 gh-pages 分支拆成 gh-pages-previewgh-pages-prod,通过 GitHub Environments 设置 审批人,实现“经理点个头才上线”。
  • 大文件优化:三维模型 >100 MB 时,GitHub Pages 拒绝单文件,可改用 阿里云 OSS + CDN,Grunt 任务里加 grunt-aliyun-oss,把大文件上传后返回 CDN 地址,HTML 里自动替换引用。
  • 合规闭环:在 gh-pages 分支根目录放 SECURITY.md开源许可证.txt,并在 CI 里用 grunt-contrib-copy 自动同步,满足国内上市审计对开源组件留痕 的要求。