使用 GitHub Actions 自动部署 Hexo

2021-03-30
3分钟阅读时长

目前部署 Hexo 的操作比较麻烦,先在本地执行 hexo clean && hexo d 生成博客静态文件并发布到 GitHub 上,然后通过 XShell 登录到服务器,切换到博客站点目录下 git pull 拉取最新的代码,最近网络也不太不稳定,拉取代码也经常超时,更新的时候还得看运气。

有两种方案可以自动更新:GitHub WebHook 和 GitHub Actions。

WebHook 是一种比较简单且常见的方式,在仓库配置一个回调地址并指定需要回调的事件类型即可。

比如指定了 push 事件,往该仓库 push 代码时,GitHub 就会请求配置的回调地址并携带一些信息,通过这些信息就可以检查请求是否合法、是哪个仓库的谁提交了代码,从而决定是否需要更新服务器端的代码。

详情可以看官方的文档:https://docs.github.com/cn/developers/webhooks-and-events/about-webhooks

Actions 是 GitHub 新推出来(快两年,也不算新了)的一种持续集成的方案,将上面这些操作变成一个个的任务(Job)组成工作流,当发生指定事件后触发该工作流,也可以用别人写好的工作流。

更详细的内容可以看 官方文档 和阮老师的 GitHub Actions 入门教程

话不多说,直接贴 GitHub Actions 的配置。

# 工作流的名称
name: Hexo Blog CI

# 指定触发的条件,这里是打标签才触发该工作流,你也可以改成 on: push,只要提交代码就触发
on:
  push:
    tags:
    - 'v*'

jobs:
  build: 
    runs-on: ubuntu-latest 
        
    steps:
    
    # 检查工作流是否可以访问 actions
    - name: Checkout Repository master branch
      uses: actions/checkout@master 
      
    # 安装 NodeJs
    - name: Setup Node.js 12.x 
      uses: actions/setup-node@master
      with:
        node-version: "12.x"
    
    # 安装 Hexo 的依赖库
    - name: Setup Hexo Dependencies
      run: |
        npm install hexo-cli -g
        npm install
    
    # 设置 Hexo 部署的私钥
    - name: Setup Deploy Private Key
      env:
        HEXO_DEPLOY_PRIVATE_KEY: ${{ secrets.HEXO_DEPLOY_PRIVATE_KEY }}
      run: |
        mkdir -p ~/.ssh/
        echo "$HEXO_DEPLOY_PRIVATE_KEY" > ~/.ssh/id_rsa 
        chmod 600 ~/.ssh/id_rsa
        ssh-keyscan github.com >> ~/.ssh/known_hosts
    
    # 设置 Git 信息
    - name: Setup Git Infomation
      run: | 
        git config --global user.name "Git 用户名" 
        git config --global user.email "Git 邮箱"

    # 部署 Hexo 静态文件到博客所在的分支
    - name: Deploy Hexo 
      run: |
        hexo clean
        hexo generate 
        hexo deploy

    # 部署到服务器
    - name: Deploy Server
      uses: appleboy/ssh-action@master
      env: 
        SITE_DIR: 站点目录(如:/var/www/blog)
      with:
        host: ${{ secrets.SERVER_IP }}
        port: ${{ secrets.SERVER_PORT }}
        username: ${{ secrets.SERVER_USERNAME }}
        key: ${{ secrets.SERVER_PRIVATE_KEY }}
        envs: SITE_DIR
        script: |
          cd $SITE_DIR
          sudo git config --global pull.rebase true
          sudo git pull origin master --allow-unrelated-histories

其中 Git 用户名Git 邮箱站点目录 都要替换成你自己的。

首先打开 https://github.com/用户名/仓库名/settings/secrets/actions 新增几个 Action secret,在上面的执行工作流的时候会用到。

需要新增以下几项:

NameValue
SERVER_IP服务器 IP
SERVER_PORT服务器端口号
SERVER_USERNAME用户名
SERVER_PRIVATE_KEY服务器私钥(服务器的 ~/.ssh/id_rsa)
HEXO_DEPLOY_PRIVATE_KEY部署私钥(本地的 ~/.ssh/id_rsa)

前三项就不多说,主要讲下后面两项怎么设置。

HEXO_DEPLOY_PRIVATE_KEY 是为了在工作流中能够提交代码到 GitHub,SERVER_PRIVATE_KEY 是为了能在工作流中登录到服务器上执行命令。

工作流被触发后,先生成博客的静态文件,并通过 hexo deploy 提交到博客所在的分支(由 Hexo 配置文件中的 deploy.branch 指定),这里涉及到提交代码,所以要配置 SSH Key。

查看电脑上是否已经生成了密钥对。

$ ll ~/.ssh
# 输出: id_rsa  id_rsa.pub  known_hosts

如果为空则执行以下命令,一路回车就可以了:

$ ssh-keygen -t rsa -C "你的邮箱"

这时候电脑上就会有两个文件:~/.ssh/id_rsa、~/.ssh/id_rsa.pub,分别是是私钥和公钥。

id_rsa 文件的内容就是 HEXO_DEPLOY_PRIVATE_KEY 的 Value。

然后打开 https://github.com/settings/ssh/new,将 id_rsa.pub 的内容填到 Key 里面,Title 可以随便去,然后保存。

接下来就是 SERVER_PRIVATE_KEY,登录到服务器拿到密钥对,步骤跟上面差不多,没有的话就生成。

服务器中 ~/.ssh/id_rsa 文件的内容就是 SERVER_PRIVATE_KEY 的 Value,然后将 ~/.ssh/id_rsa.pub 的内容追加到 ~/.ssh/authorized_keys 文件中。

需要注意:

  • 服务器中必须已经存在 SITE_DIR 目录,且已经将仓库 clone 下来了。
  • 在服务器上可以免密执行 git pull。

更新博客时只需要打标签,然后将标签推送到云端就会触发工作流。

$ git tag v1.0.0
$ git push origin v1.0.0

GitHub Actions Log
GitHub Actions Log

本文作者:她和她的猫
本文地址https://her-cat.com/posts/2021/03/30/github-action-deploy-hexo/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!