转载自:用GitHub Actions 自动化发布Hexo网站到GitHub Pages - 掘金 (opens new window)

之前我已经习惯了自己在本地部署 Hexo 并 push,也写过一个一键 push 到博客部署仓库和博客仓库的 shell 脚本,如下:

#!/bin/bash

echo
echo pushing to lyh543/lyh543.github.io.backup
echo

git add --all
git commit -m "update on $(date +%c)"
git push origin

# 当存在任意参数,如调用时使用 `./hexop 1` 时,则不会 push 到博客部署仓库
if [ -z $1 ]; then
    echo
    echo pushing to lyh543/lyh543.github.io
    echo

    hexo d -g
fi

一直这么用着,也没有觉得比 GitHub Actions 麻烦很多,直到当我有同时在笔记本和台式上写博客的需求。deploy 到 GitHub 过程中,如果此次部署的电脑和上次不同,会导致博客部署仓库的 Git 提交记录冲突,必须使用 forced update,导致每次都需要把所有文件重新传一份。

于是开始学习了 GitHub Actions。发现还不错。而且网上也有现有的部署 Hexo 的中文教程可用。下面转载这篇文章,并加入自己的理解。

# 准备 Hexo 网站

在本地建立一个 Hexo 站点,可以参考官方快速开始文档。

建立两个 GitHub 仓库,分别叫 blog(私有的,名字可自取)和 your_github_username.github.io(公有的)。前者用来存储博客源文件,后者用于存储博客部署文件。这里我选择 lyh543.github.io.backup 存储博客源文件,lyh543.github.io 存放博客部署文件。

两个仓库最终的效果

然后将本地的博客源文件推送到 lyh543.github.io.backup 仓库。

# 准备 SSH 秘钥

为了方便运行 GitHub Actions 时登录 GitHub 账号,我们使用 SSH 方式登录。

在本地使用 ssh-keygen 生成一组公私秘钥对:

ssh-keygen -t rsa -b 4096 -f ~/.ssh/github-actions-deploy

生成了公钥 ~/.ssh/github-actions-deploy.pub 和私钥 ~/.ssh/github-actions-deploy

在 GitHub 的 Settings->SSH and GPG keys 添加刚刚生成的公钥,名称随意。

lyh543.github.io 仓库的 Settings->Secrets 里添加刚刚生成的私钥,名称为 ACTION_DEPLOY_KEY

如果在 Hexo deploy 过程中还需要 sftp 部署到服务器,则还需要在服务器添加私钥:在本地执行 ssh-copy-id -i ~/.ssh/github-actions-deploy.pub root@you-server-ip.com

# 设置 Hexo 的部署配置

_config.yml 添加部署配置:

# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
- type: git
  repo:
    github: git@github.com:lyh543/lyh543.github.io.git
  branch: master
# 如果有 sftp 部署到服务器的需求,则可将下面的部分取消注释
# - type: sftp
#   host: your-server-ip.com
#   user: root
#   # pass: <password>
#   remotePath: /var/www/html/blog
#   port: 22
#   privateKey: /home/runner/.ssh/id_rsa # runner 是 GitHub Actions 的 username(这里不能使用 ~ 代替 /home/runner)
#   # passphrase: [passphrase]
#   # agent: [path/to/agent/socket]

# 配置 GitHub Actions

lyh543.github.io.backup 仓库的 Actions 选项卡下点击新建 workflow,编写如下配置。

name: Deploy Blog

on: [push] # 当有新push时运行

jobs:
  build: # 一项叫做build的任务

    runs-on: ubuntu-latest # 在最新版的Ubuntu系统下运行
    
    steps:
    - name: Checkout # 将仓库内master分支的内容下载到工作目录
      uses: actions/checkout@v1 # 脚本来自 https://github.com/actions/checkout
      
    - name: Use Node.js 10.x # 配置Node环境
      uses: actions/setup-node@v1 # 配置脚本来自 https://github.com/actions/setup-node
      with:
        node-version: "10.x"
    
    - name: Setup Hexo env
      env:
        ACTION_DEPLOY_KEY: ${{ secrets.ACTION_DEPLOY_KEY }}
      run: |
        # set up private key for deploy
        mkdir -p ~/.ssh/
        echo "$ACTION_DEPLOY_KEY" | tr -d '\r' > ~/.ssh/id_rsa # 配置秘钥
        chmod 600 ~/.ssh/id_rsa
        ssh-keyscan github.com >> ~/.ssh/known_hosts
        # ssh-keyscan your-server-ip.com >> ~/.ssh/known_hosts # 如果需要 sftp,则还需要注释掉一行
        # set git infomation
        git config --global user.name 'lyh543' # 换成你自己的邮箱和名字
        git config --global user.email 'lxl361429916@live.com'
        # install dependencies
        npm i -g hexo-cli # 安装hexo
        npm i
  
    - name: Deploy
      run: |
        # publish
        hexo generate && hexo deploy # 执行部署程序

新建 Workflow

直接将配置复制覆盖左边的编辑框的内容即可。名称可自取。然后在本地 git pull

之后就可以在 GitHub Actions 看到这次部署了。

GitHub Actions