让Github Actions自动构建Hugo博客

自从Github Actions发布之后总想找机会一探究竟,今天花了点时间终于在本站上配置好了,总体上和Gitlab的CI/CD比较相似,顺便记录一下。


准备工作

创建一个repo,或者使用已有的,我这里使用的是top.github.io。在这个项目中新增一个分支,例如名称为hugo,这样做的目的是Hugo源码使用这个分支,最终生成的HTML使用master分支。以后只需要在hugo分支中更新文章,提交之后Github Actions会自动将生成的结果提交到master分支,而master分支是默认托管在Github Pages的,所以就实现了在Github上的CI/CD。

Github Actions配置文件

创建.github/workflows/build-deploy.yml文件:

name: github pages

on:
push:
branches:
- hugo # 让Actions只检测这个分支的提交

jobs:
build-deploy:
runs-on: ubuntu-18.04
steps: # 多个步骤如下表示
- name: Checkout master
uses: actions/checkout@v1

- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest' # 这里可以指定特定版本,我比较随意直接使用latest
extended: true

- name: Build
run: hugo --minify

- name: Deploy to master
uses: peaceiris/actions-gh-pages@v2 # 我试过使用@v3版本,过程总是报特殊字符错误,所以使用@v2版本
env:
ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }} # 大写的这个名称记下来,后面会用到
PUBLISH_BRANCH: master # Github自动托管这个分支
PUBLISH_DIR: ./public

配置Repo

使用以下命令生成Deploy Key和Secret:

ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f secret -N ''

将secret.pub的内容配置到项目设置中的Deploy keys中,名称无所谓,勾选允许写入。再将secret的内容配置到项目设置中的Secrets中,名称须与以上配置文件中的大写字母相匹配。配置完之后这两个文件就没用了,删之。

设置自动更新ie9.org

在ie9.org的服务器上设置一个webhook,同样配置在repo的设置中,这样每次提交代码之后,Github就会自动和webhook server通讯,激活配置的脚本间接运行git pull origin master就可以实现更新网站了。

至于为什么不在Github Actions中直接远程更新网站,主要的考虑还是安全问题。从合理性的角度看,虽然webhook server依然必须存在,但低耦合的设计保证了有限的权限开放和灵活的配置方式,这样做还是值得的。

2020-03-26 更新

晚上把域名ie9.org绑定在Github Pages上,这样我的主机就彻底用不上了。整个架构更加简洁——在hugo分支更新内容,提交之后就自动更新到主站上,和带后台的管理系统没有区别了。

参考
  • https://github.com/top/top.github.io

Comments

Posts

做博客,除了内容,你什么都不应该关心

应该成为什么样的技术人

2020创业阶段汇报