利用Github Action部署Hexo博客

本文最后更新于 2025年1月5日 晚上

涉及源码见 https://github.com/GentleCold/GentleCold.github.io

介绍

使用 Hexo 作为搭建博客的框架,流程如下:

npm install -g hexo-cli // 安装Hexo
hexo init blog          // 初始化博客
cd blog
npm install             // 安装依赖
hexo server

我们只需要关注以下文件:

.
├── public
├── source
│   └── _posts
└── _config.yml
  • public: 生成的整个静态网站(index.html作为入口)
  • source: 源文件 (此文件夹下内容会被复制到public目录下)
    • _posts: 博客内容 (.md文件,被转换为对应的文章)
  • _config.yml: 配置文件

一些常用命令:

hexo g     // 生成静态网站(public/)
hexo clean // 清除缓存
hexo s     // 启动服务

部署方案选择

创建名为yourname.github.io的仓库,并设置可见性为public(也可以private,但是要加钱)

Github Pages 提供了两种部署方案:

对于第一种,需要编写workflows

对于第二种,只需将public目录下的内容放入即可

现考虑几种一键部署方案:

  • 利用插件部署hexo-deployer-git
    • ✅ 可以额外将Hexo配置文件上传并设为私密,以供多端部署
    • ❎ 需要提供Github token
  • 再创建一个仓库,将Hexo文件上传(不包含public),并编写workflows,对于每次commit,将生成的public文件推送到pages仓库下
    • ✅ 可以将Hexo配置文件上传并设为私密
    • ❎ 需要提供Github token
  • 将源改为Github Action,直接将Hexo文件上传pages仓库并触发action部署
    • ✅ 无需token
    • ❎ 无法设为私密

相对来说,更推荐第一种和第三种(第二种其实重复造轮了

最终笔者选择了第三种:

  • 一键部署:一次commit,既保存了配置文件,又部署了网站
  • 私密性问题:本身就是静态网站,用户可以看到所有内容,只不过这种方案还可以看到Hexo的配置内容,会产生配置中需要填写API token的问题(之后给出解决方法)

编写workflows

官方文档其实给出示例了,不过那个文档有些老(甚至触发条件还是main分支

修改如下:

name: Pages

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@main
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          # If your repository depends on submodule, please see: https://github.com/actions/checkout
          submodules: recursive
      - name: Use Node.js 21.6.1
        uses: actions/setup-node@main
        with:
          node-version: '21'
      - name: Cache NPM dependencies
        uses: actions/cache@main
        with:
          path: node_modules
          key: ${{ runner.OS }}-npm-cache
          restore-keys: |
            ${{ runner.OS }}-npm-cache
      - name: Install Dependencies
        run: npm install
      - name: Build
        run: npm run build
      - name: Upload Pages artifact
        uses: actions/upload-pages-artifact@main
        with:
          path: ./public
  deploy:
    needs: build
    permissions:
      pages: write
      id-token: write
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@main

解决token隐私性问题

问题:此方案无法将仓库设为私密,而配置文件中又需要填写API token

workflows的流程其实就是在一个linux环境中,先把仓库代码拉下来,然后生成public文件然后部署,我们只需在需要填写token的地方用占位符标记,在workflows中添加一步,利用sed命令进行替换即可:

- name: Replace variables in _config.fluid.yml
run: |
    sed -i 's/APP_ID/${{ secrets.APP_ID }}/g' _config.fluid.yml
    sed -i 's/APP_KEY/${{ secrets.APP_KEY }}/g' _config.fluid.yml
    sed -i 's/APP_SERVER/${{ secrets.APP_SERVER }}/g' _config.fluid.yml
    sed -i 's/BAIDU/${{ secrets.BAIDU }}/g' _config.fluid.yml
    sed -i 's/GOOGLE/${{ secrets.GOOGLE }}/g' _config.fluid.yml

配置好后只要commit到master分支就可以直接部署啦,而且支持多端部署,如果换了设备只要把这个仓库拉下来就能继续编写啦


利用Github Action部署Hexo博客
https://gentlecold.top/20240205/hexo-github-action/
作者
GentleCold
发布于
2024年2月5日
许可协议