记录一下使用 GitHub Action 将 Jekyll 编译成静态网页,然后自动部署到 Google Cloud Storage bucket,最后通过 Cloudflare 的 CDN 进行缓存和加速的整个流程。
这套方案的好处:
- CI/CD 自动化:每次写完文章或者更新内容,push 到 GitHub 上以后,网页端都可以自动完成构建和部署,完全不用手动操作
- GCS 免费额度:5GB 存储空间,每月 1GB 网络出站流量。虽然流量不多,但是前端有 CDN 缓存,基本够用
- 成本低:基本上不花钱,比 VPS 便宜多了
为什么要折腾这个
说起来这个也是被逼的。半年前,我把 DigitalOcean 上那台 $5/月的旧机器升级到了 $15/月的新机器,结果可能是我中奖了还是怎么的,带宽还不如 $5 的机器。
而且可靠性也不如之前的机器。当然也可能是我这半年空闲时间比较多,使劲折腾把它搞坏了。总之,用了半年以后,我还是决定弃用这个机器。
各种折腾都放在自己家里的服务器上了(这个也有很多可以说的,以后有空再讲)。所以在 VPS 上用 nginx 作为 HTTP 服务器搭建的这个博客就需要移动位置了。
考虑过的几个选项
1. 在家里的服务器上配置个 nginx
家庭网络可靠性欠佳,而且 ISP 可能会封 80/443 端口,不太靠谱。
2. 使用 GitHub Pages
这应该是最简单的方案,但是有很多限制:
- 需要仓库是公开的,而我想要把仓库改为私有
- 无法添加个人 gem,比如我改了一些主题设置,GitHub Pages 就没法包括这个
在我尝试安装本地环境失败以后,我就排除了这个选项。
3. GitHub Action + GCS + Cloudflare(本文方案)
自己控制整个构建和部署流程,灵活度高,而且基本不花钱。就它了!
0. 当前VPS下构建步骤
构建和部署写在了一个shell脚本里面:
#!/bin/bash
cd /path_to_repo/
git pull
if [ $? -ne 0 ]
then
exit 1
fi
jekyll build
if [ $? -ne 0 ]
then
exit 1
fi
rsync -a /path_to_repo/_site /path_to_www/
使用了crontab每天定时运行此脚本。
1. 使用Github Action来执行CI/CD
1.1 Jekyll Build
这一步非常简单,直接使用GitHub提供的Jekyll构建的模板:
name: Jekyll site CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build the site in the jekyll/builder container
run: |
docker run \
-v $:/srv/jekyll -v $/_site:/srv/jekyll/_site \
jekyll/builder:latest /bin/bash -c "chmod 777 /srv/jekyll && jekyll build --future"
修改一下自己的branch名称,
1.2 复制输出_site文件夹到GCS
这一步参考了google-github-actions/setup-gcloud里的例子,
配置Google Cloud SDK
这个步骤有一些先决条件:
- 需要去GCP console的APIs & Services/Credentials下配置一个Service Account

- 去GCS bucket将刚才添加的service账号加上权限(也可以在API那边加上,不过这样的话,这个service账号就会有读写所有bucket的权限)

- 回到API & Services下创建一个新的auth key,选择JSON并下载保存到本地打开。

- 到Github Repo的secrets下面添加
GCP_PROJECT_ID: 是你的GCP project id,点击上方选择project会弹出,复制即可。
GCP_SA_KEY: 复制第三步的json文件内容。

Action
在刚才Jekyll Build的那个模板下方添加:
- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@master
with:
project_id: $
service_account_key: $
export_default_credentials: true
复制网站内容到GCS
配置好上面步骤以后,就可以运行脚本将内容复制到gcs bucket。这里直接用了gsutil的rsync命令:
- name: Use gcloud CLI
run: gsutil -m rsync -r -d ./_site/ gs://xbb.yicheng.ren
1.3 触发Action
做完所有这些,比如说我现在将此文章的内容push到github上以后,设定的action就会自动执行并更新网站:

2 Cloudflare设置
