初探Github Actions: hexo博客自动部署

2020年12月:本站已经切换到HUGO

2019年11月,Github正式发布了Github Actions这个功能。

Github Actions: Automate your workflow from idea to production

之前看了阮一峰的文章:GitHub Actions 教程:定时发送天气邮件,觉得这个东西特别有趣。但是由于这个东西对我来说没有解决什么痛点,所以一直懒得去看文档。

近日居家无聊,偶得一帖利用 Github Action 部署 Hexo,于是想自己也搞一个。

普通hexo博客的运作方式:在本地生成静态网页,然后推送到github page上面。

结合github actions后:直接把markdown文件推送到github, 之后有github的服务器来生成网页。

前者相对后者的优势:无。

后者相对前者的优势:本地不再需要nodejs环境,不再需要保存源码,可以在任意安装git的设备上发文。

思路

在原有仓库的基础上新建一个source分支,将源码推送到此分支上。然后通过github actions监控此分支的push事件,一旦有新的推送就更新master分支上的网页。

步骤

  1. 克隆github page所在的仓库。
git clone [email protected]:{username}/{username}.github.io.git
  1. 新建分支并保存源码。执行:
cd {username}.github.io
git checkout -b source
ls -A | grep -v '\.git' | xargs rm -rf
# 假设博客的源码保存在 source 目录
cp -r ../source/* ./
  1. 创建github actions配置文件。github actions使用的配置文件是yaml格式的,文件后缀必须是.yml或者.yaml。并且必须放在.github/workflows目录下。本项目使用的配置文件可以在文末找到。关于yaml格式的介绍可以访问官网

  2. 关于主题。由于hexo的主题一般是一个独立的仓库,所以博客的仓库中追踪主题文件并不合适。一种解决方法是使用git的子模块功能。由于本博客创建时使用的主题版本已经不再维护了,而新版的主题配置文件与旧配置文件并不兼容,所以本博客采用的方法是:使用tar把所有的主题文件打包。在部署的时候再展开。

  3. 关于github actions

github action每次运行都在一台环境全新的机器上。截止本文发布,github actions可选择的环境有:

linux windows macos
ubuntu-18.04, ubuntu-16.04 windows-2019 macos-10.15

github actions 使用的机器和安装相同系统的普通服务器基本相同,通过一些奇迹淫巧甚至可以使用ssh连接。

在github actions中操作仓库可以通过actions/[email protected],在actions运行时需要授权的git命令也可以正常执行,例如对仓库的push操作。关于actions/[email protected]的使用可以访问https://github.com/actions/checkout。github官方提供的基本操作都在https://github.com/actions中。

另外,github actions对运行时间和并发量都有一定限制。免费用户单个actions运行时间不能超过6小时(不确定),每月总运行时间2000分钟。

本项目的配置文件(.github/workflows/hexo.yaml)

name: Hexo auto generate

# 仅在source分支push的时候运行。
on: 
  push:
    branches:
    - source

jobs:
  my-job:
    name: Build and deploy
    runs-on: ubuntu-18.04
    steps:
    - name: Checkout master
      uses: actions/[email protected]
      with:
        ref: master
        path: master
    - name: Checkout source
      uses: actions/[email protected]
      with:
        ref: source
        path: source
    - name: Initial Nodejs
      uses: actions/[email protected]
      with:
        node-version: 13.x
    - name: Install dependencies
      run: |
        cd source
        npm install hexo-cli -g
        npm install
        cd ..        
    - name: Install themes
      # 这里是通过git下载最新版的主题
      # run: |
      #   cd source
      #   mkdir -p themes && cd themes
      #   git clone https://github.com/iissnan/hexo-theme-next next
      #   cd next
      #   cp ../../_config.theme.yml ./_config.yaml
      # 由于旧版的配置文件无法在新版中使用,因此这里使用tar打包的旧版主题
      run: |
        cd source
        mkdir -p themes
        tar -xf next_theme_5.1.4.tar -C themes/
        cp -f _config.theme.yml ./themes/next/_config.yaml        
    - name: Generate
      run: |
        cd source && hexo g && cd ..
        cp -rf source/public/* master/        
    - name: Git push to master
      run: |
        cd master
        git config --local user.email "[email protected]"
        git config --local user.name "gh_action"
        date=$(date +'%Y-%m-%d %H:%M:%S')
        git add .
        git commit -m "Auto updated: $date"
        git push origin master        

.gitignore文件

.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
themes/