Github Action部署Jekyll博客到GCS

Yicheng 于 2020-11-24 发布

记录一下使用 GitHub Action 将 Jekyll 编译成静态网页,然后自动部署到 Google Cloud Storage bucket,最后通过 Cloudflare 的 CDN 进行缓存和加速的整个流程。

这套方案的好处:

为什么要折腾这个

说起来这个也是被逼的。半年前,我把 DigitalOcean 上那台 $5/月的旧机器升级到了 $15/月的新机器,结果可能是我中奖了还是怎么的,带宽还不如 $5 的机器

而且可靠性也不如之前的机器。当然也可能是我这半年空闲时间比较多,使劲折腾把它搞坏了。总之,用了半年以后,我还是决定弃用这个机器。

各种折腾都放在自己家里的服务器上了(这个也有很多可以说的,以后有空再讲)。所以在 VPS 上用 nginx 作为 HTTP 服务器搭建的这个博客就需要移动位置了。

考虑过的几个选项

1. 在家里的服务器上配置个 nginx

家庭网络可靠性欠佳,而且 ISP 可能会封 80/443 端口,不太靠谱。

2. 使用 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

这个步骤有一些先决条件:

  1. 需要去GCP console的APIs & Services/Credentials下配置一个Service Account 添加服务账号
  2. 去GCS bucket将刚才添加的service账号加上权限(也可以在API那边加上,不过这样的话,这个service账号就会有读写所有bucket的权限) 添加权限
  3. 回到API & Services下创建一个新的auth key,选择JSON并下载保存到本地打开。 创建key 创建json key
  4. 到Github Repo的secrets下面添加 GCP_PROJECT_ID: 是你的GCP project id,点击上方选择project会弹出,复制即可。 GCP_SA_KEY: 复制第三步的json文件内容。 添加secrets

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设置

CF流量缓存