# 前言

在学习 github actions 的时候,想到自己的博客是否能在每次 push 时自动部署。在参考了几篇文章之后,实现了此功能。

# 准备

准备两个 git 仓库

  1. blogFile :用来存放博客的源文件
  2. xxx.github.io :用来存放博客编译后的文件,也是使用 github pages 的仓库,xxx 是你的 github 用户名

# 开始

# 生成 SSH 密钥

为了在 github actions 中 执行 hexo deloy ,需要使用 SSH 密钥认证。

  1. 打开终端
  2. 执行下面的命令,将示例中使用的电子邮件替换为 GitHub 电子邮件地址。
ssh-keygen -t ed25519 -C "your_email@example.com"
  1. 一路回车,之后会生成 id_ed25519 私钥和 id_ed25519.pub 公钥文件。

# 添加密钥

在 blogFile 仓库中 选中 Settings ,选择左侧栏 Secrets and variables 中的 Actions ,然后点击 New repository secret 创建 secrets 变量,把 id_ed25519(私钥) 中的内容添加进去。

xxx.github.io 仓库中 选中 Settings ,选择左侧栏的 Deploy keys ,然后点击 Add deploy key ,勾选 Allow wirte access ,把 id_ed25519.pub(公钥)中内容添加进去。

# 一键部署

要在 actions 中使用 hexo deploy ,先需要实现 hexo 中的 一键部署

  1. 安装 hexo-deployer-git
npm install hexo-deployer-git --save
  1. 在博客根目录中的 _config.yml 中修改配置。
deploy:
  type: git
  repo: git@github.com:xxx/xxx.github.io.git
  branch: master

repo 为 xxx.github.io (存放编译后文件的那个仓库)的 SSH 地址。
branch 为部署的分支。自己的是 master 还是 main 不要搞错了。

# Actions

  1. 在博客根目录中新建 .github 文件夹。
  2. .github 中新建 workflows 文件夹。
  3. workflows 中新建 deploy.yml 文件。
# deploy.yml
name: Deploy Actions
on:
  push:
    branches: main # main 分支发生 push 时运行
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: NPM INSTALL
        run: |
          npm install hexo-cli -g
          npm install
      - name: Add KEY
        env:
          # 
          SSH_PRIVATE: ${{ secrets.SSH_DEPLOY_KEY }}  # 替换为在 blogFile 中添加的私钥变量 
          # 
        run: |
          mkdir -p ~/.ssh/
          echo "$SSH_PRIVATE" > ~/.ssh/id_rsa
          chmod 700 -R ~/.ssh
          ssh-keyscan github.com >> ~/.ssh/known_hosts
          git config --global user.email "xxxx@xx.com" 
          git config --global user.name "xxxx"
      - name: Hexo Deploy
        run: |
          hexo clean
          hexo generate
          hexo deploy
  1. 替换上面的 SSH_DEPLOY_KEY 为你在 blogFile 中添加的私钥变量。
  2. 替换 user.emailuser.name 为你 github 邮箱和用户名。