Hexo + Github Action部署博客

本文首发地址(https://hubojing.github.io/2023/11/16/Hexo+GithubAction部署博客/

更换部署方式的原因

(不关心的朋友可以跳过这一节)

  以前许多年一直是hexo clean && hexo g && hexo d一键部署,这样导致每台机器上都需要配置环境,以前还挺喜欢折腾这些,写过Hexo多机同步 ,但是通过篇幅可以看出,太麻烦,不符合工作后能够快速更换设备的需求。近年来我逐渐注意到CI/CD的方法,先是在Gitlab上体验了一把,确实好用,后来某天惊喜发现Github出了官方的Github Action,于是有了本文的尝试。

  更换后,换机再也不用安环境了,只需要把源文件项目git clone一下,写文,在git add .git commit -m 'update'git push三部曲就好啦!

两个项目

源文件 user/blog-source (privare)

  前端显示 username/username.github.io (public)

两把钥匙

在源文件项目git bash

复制代码
ssh-keygen -f blog-deploy-key

生成

  • 私钥 blog-deploy-key
  • 公钥 blog-deploy-key.pub

配置:

  • 源文件项目 settings - Secrets and variables - Actions 放入私钥
  • 前端展示项目 settings - Deploy keys 放入公钥

workflow

创建相关文件夹和文件,源文件根路径下blog/.github/workflows/deploy.yml

  参考模板在这里https://github.com/marketplace/actions/hexo-action

复制代码
 # Deploy hexo blog website.
    - name: Deploy
      id: deploy
      uses: sma11black/hexo-action@v1.0.3
      with:
        deploy_key: ${{ secrets.HEXO_DEPLOY_PRI }}
        user_name: username  # (or delete this input setting to use bot account)
        user_email: your email  # (or delete this input setting to use bot account)
        PUBLISH_REPOSITORY: username/username.github.io
        BRANCH: master
        PUBLISH_DIR: ./public
        commit_msg: ${{ github.event.head_commit.message }}  # (or delete this input setting to use hexo default settings)

关于主题的配置

这一部分写的人太少,疯狂采坑,我来详细说一下。

  主题是作为submodule加入的,但是配置如果不想被看到的话,最好单独写成文件,具体看这里:

  但是单独配置文件的写法需要hexo5.0以上才能实现,indigo主题才3.0+,所以最简单的方法是fork原主题后,设置为private。

  要访问private项目是需要授权的。

具体做法

  • Github-Settings-Developer settings-Personal access tokens-Tokens(classic)-Generate new token(classic)

  • 复制该token

  • 在源文件项目blog-source中在源文件项目blog-source中:Settings-Secrets and variables-Actions-New repository secret,粘贴该token

  • 在workflow的配置文件中写

    with:
    token: ${{ secrets.PERSONAL_TOKEN }}
    submodules: true

完整的deploy.yml

复制代码
name: Deploy

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    name: A job to deploy blog.
    steps:
    - name: Checkout
      uses: actions/checkout@v1
      with:
        token: ${{ secrets.PERSONAL_TOKEN }}
        submodules: true # Checkout private submodules(themes or something else).
    
    # Caching dependencies to speed up workflows. (GitHub will remove any cache entries that have not been accessed in over 7 days.)
    - name: Cache node modules
      uses: actions/cache@v1
      id: cache
      with:
        path: node_modules
        key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-
    - name: Install Dependencies
      if: steps.cache.outputs.cache-hit != 'true'
      run: npm ci
    
    # Deploy hexo blog website.
    - name: Deploy
      id: deploy
      uses: sma11black/hexo-action@v1.0.3
      with:
        deploy_key: ${{ secrets.HEXO_DEPLOY_PRI }}
        user_name: username  # (or delete this input setting to use bot account)
        user_email: your email  # (or delete this input setting to use bot account)
        PUBLISH_REPOSITORY: username/username.github.io
        BRANCH: master
        PUBLISH_DIR: ./public
        commit_msg: ${{ github.event.head_commit.message }}  # (or delete this input setting to use hexo default settings)
    # Use the output from the `deploy` step(use for test action)
    - name: Get the output
      run: |
        echo "${{ steps.deploy.outputs.notify }}"

无伤大雅的缺点

这个应该是git操作的哪个部分出问题了,导致git push后前端项目历史push记录丢失了,损失就是github页的绿点没了,其它的没什么影响,毕竟前端页面的渲染结果没源文件有用。git reflog只剩下最新的一条,历史的都丢失了,不过不影响博客就算了。这个问题这些年也遇到好几次了,如果有大佬遇到过一样的问题,如愿赐教,将非常感谢。

参考

Hexo&github action持续部署
Using Git Submodules for Private Content
github action 部署 hexo踩坑记录
Github Actions: submodule 下公私有仓库授权和通信
利用 Github Actions 自动部署 Hexo 博客

相关推荐
峰向AI6 小时前
GenOffice:开源 Office 套件,字节级保留、本地转换、BYOK模式
github
其实防守也摸鱼8 小时前
权限提升与横向移动:从内网渗透到域控的完整技术图谱
运维·服务器·数据库·安全·github·copilot·渗透
m4Rk_8 小时前
【论文阅读】Agent 记忆机制(57):MemSearch-o1——从查询词元生长证据,重组 Deep Search 记忆路径
论文阅读·人工智能·学习·开源·github
其实防守也摸鱼8 小时前
免杀与持久化入门:从载荷免杀到隐蔽通道的完整指南
运维·服务器·数据库·安全·github·copilot·渗透
sec_jay8 小时前
一个面向有限本地语料库的、单智能体、工具调用型 Agentic RAG 原型--关于agent的实践调研报告
github
goplaysource11 小时前
IPTV 频道去重:用哈希解决"同一个频道出现十遍"的问题
github
liuyicenysabel12 小时前
从 0 到 1:一套 GitHub + GHCR + k3s 的全自动 CI/CD 流水线(Flask 项目实战)
ci/cd·flask·github
u13013013 小时前
GitHub 热榜项目:日榜(2026-08-31)
github
Justinsky14 小时前
DeepSeek Harness 开源一个月,我把它整个嵌进了 Electron 桌面软件
github
小宋102114 小时前
MCP 是什么:从零编写一个可供 AI 调用的工具服务
人工智能·github