Hexo 通过 Github Actions 实现持续集成

利用Github Actions[1]来实现博客的持续集成(CI)以及持续部署(CD)[2]

一般部署好hexo博客后通过hexo g 将写好的Markdown文件转化为HTML文件然后再hexo d把生成的public文件推送到Github仓库中。

但是,直接将生成的可以运行的实际代码(生产版)推送到 GitHub 仓库上,而不是博客源码(开发版),那这样便无法利用 GitHub 来对源码进行版本控制,也就不利于博客未来的维护、更新、开发,以及可能的开源开发。[3]

NetlifyTravis CIGithub Actions

本次主要讲Github Actions 来进行hexo实现在线写作。

Github Actions

GitHub Actions 是 GitHub 于 2018 年 10 月推出的持续集成服务。

它的工作原理即为:当我们提前设置好需要自动化执行的任务(.github/workflows 下的文件)后,GitHub Actions 会监控当前仓库的某一个操作(如:push),一旦有此操作,就自动化执行这些任务。

我们设置的任务即为 Action ,它存放在博客根目录的 .github/workflows 下,后缀为 .yml。一个 Action 相当于是一个工作流 workflow,一个工作流则可以有多个任务 (job),而每个任务又能分成几个步骤(step)。任务、步骤会依次执行。

现在代入 Hexo。我们把源码提交到了仓库的一个分支上,GitHub Actions 监听到了该分支的提交操作(push),便会开始执行我们在 .github/workflows 下放置的文件中的代码。我们需要 GitHub Actions 执行的任务即为我们在根目录下执行的命令(如hexo g)。

注意:GitHub Actions 并没有我们的操作环境,我们得给它设置亦或是通过有关命令安装配置所需的环境。通过后面给出的任务文件内容可看出。

准备工作

首先我们得获取 GH_TOKEN 。

Personal access tokens (github.com)

选择框全选即可。

本地hexo文件上传github私有库

git init
git remote add origin git@github.com:Mintneko/mintneko.git
git config --global user.email "pokgliu@foxmail.com"
git config --global user.name "Mintneko"
git pull --rebase origin master
git add .
git commit -m "blog master"
git push -u origin master

编写actions运行文件

/.github/workflows/deployment.yml

name: Blog CI/CD

# 触发条件:在 push 到 master 分支后触发
on:
push:
branches:
- master

env:
TZ: Asia/Shanghai

jobs:
blog-cicd:
name: Hexo blog build & deploy
runs-on: ubuntu-latest # 使用最新的 Ubuntu 系统作为编译部署的环境

steps:
- name: Checkout codes
uses: actions/checkout@v2

- name: Setup node
# 设置 node.js 环境
uses: actions/setup-node@v1
with:
node-version: '12.x'

- name: Cache node modules
# 设置包缓存目录,避免每次下载
uses: actions/cache@v1
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}

- name: Install hexo dependencies
# 下载 hexo-cli 脚手架及相关安装包
run: |
npm install -g hexo-cli
npm install
- name: Generate files
# 编译 markdown 文件
run: |
hexo clean
hexo generate
- name: Deploy hexo blog
env:
# Github 仓库
GITHUB_REPO: github.com/Mintneko/mintneko.github.io
# Coding 仓库
#CODING_REPO: e.coding.net/yifanzheng/blogs.git
# Gitee 仓库
#GITEE_REPO: gitee.com/yifanzheng/yifangzheng.gitee.io.git
#两条编写在下方run里面
#git push --force --quiet "https://RoYFbFDSfM:${{ secrets.CODING_TOKEN }}@$CODING_REPO" master:master
#git push --force --quiet "https://yifanzheng:${{ secrets.GITEE_ACCESS_TOKEN }}@$GITEE_REPO" master:master
# 将编译后的博客文件推送到指定仓库
run: |
cd ./public && git init && git add .
git config user.name "Mintneko"
git config user.email "pokgliu@foxmail.com"
git add .
git commit -m "GitHub Actions Auto Builder at $(date +'%Y-%m-%d %H:%M:%S')"
git push --force --quiet "https://${{ secrets.GH_TOKEN }}@$GITHUB_REPO" master:master

修改好名字和邮箱即可