借助强大的 Github Action,我们能够轻松地实现博客的自动化构建与部署,让整个流程更加优雅高效。在这个过程中,我们选用了 Hugo 这一优秀的工具,它与 hexo 一样,都是出色的静态博客生成器。

考虑国内网络环境,我们选择了腾讯云COS来部署博客,以提供更快速、稳定的访问体验。这个策略让博客的美感与技术有机融合,为读者呈现出精致的阅读空间。

准备工作:

  1. 到腾讯云–访问管理用户列表,新建一个账户

地址: https://console.cloud.tencent.com/cam

  1. 访问方式改为"编程访问”,用户权限添加"QcloudCOSDataFullControlQcloudCDNFullAccess"。完成之后将生成的 SecretId、SecretKey 复制保存。

  2. 到 Github 新建一个仓库(私有公共都行),把自己 hugo 生成的站点源文件(不是 public 下文件)同步过去。

  3. 在刚创建的仓库——Settings——Secrets and variables——Actions

  4. 新建 SecretIdSecretKeyBucketRegion 四个密钥。其中 SecretId、SecretKey 为上面复制保存的,Bucket(存储桶名称)、 Region(所属地域 如:ap-guangzhou )在 COS 中存储桶列表中获取。

自动构建

在博客仓库根目录下新建 .github/workflows 文件夹,新建一个 deploy.yml(文件名随意),作用:借助 Github Action 实现自动部署

注意: 第5 38 40 行

第5行触发的分支是main还是master, 

第38行改为你的用户名和仓库名,比如: 111/222

第40行是Github Pages 所在分支

最后两行是同步根目录还是public目录

完整脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
name: Auto Deploy hugo
on:
  push:
    branches:
      - main # 更新触发的分支
jobs:
  build-deploy:
    #  runs-on: ubuntu-latest
    runs-on: ubuntu-20.04
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3
        with:
           submodules: recursive # Fetch Hugo themes (true OR recursive)
           fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
      - name: Setup hugo
        uses: peaceiris/actions-hugo@v2
        with:
          #  hugo-version: "latest" # 可以修改为你使用的 Hugo 版本
          hugo-version: "0.113.0"
          extended: true # 设置是否需要 extended 版本

      - name: Cache resources # 缓存 resource 文件加快生成速度
        uses: actions/cache@v3
        with:
         path: resources
         # 检查照片文件变化
         key: ${{ runner.os }}-hugocache-${{ hashFiles('content/**/*') }}
         restore-keys: ${{ runner.os }}-hugocache-

      - name: Build Hugo static files # 部署静态资源
        run: hugo --gc --minify

      - name: Deploy to Github Pages  # 部署到Github Pages页面
        uses: peaceiris/actions-gh-pages@v3
        with:
          personal_token: ${{ secrets.PERSONAL_TOKEN }} # 两个仓库请使用 deploy_key
          external_repository: 111/222  # 如果在同一个仓库请注释
          publish_dir: ./public # hugo 生成到 public 作为跟目录
          publish_branch: main # Github Pages 所在分支
          commit_message: ${{ github.event.head_commit.message }}

# 上传到腾讯COS存储桶

      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.9

      - name: Setup coscmd and sdk
        run: sudo pip install coscmd

      - name: Configure coscmd
        env:
          SECRET_ID: ${{ secrets.SecretId }}
          SECRET_KEY: ${{ secrets.SecretKey }}
          BUCKET: ${{ secrets.Bucket }}
          REGION: ${{ secrets.Region }}
        run: coscmd config -a $SECRET_ID -s $SECRET_KEY -b $BUCKET -r $REGION

      - name: Upload to COS
        run: coscmd upload -rfs --delete ./ /
        # run: coscmd upload -rfs --delete public/ /

其他代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 上传到腾讯COS存储桶
      - name: Install coscmd
        run: sudo pip install coscmd
      - name: Configure coscmd
        env:
          COS_SECRET_ID: ${{ secrets.COS_SECRET_ID }}
          COS_SECRET_KEY: ${{ secrets.COS_SECRET_KEY }}
          COS_BUCKET_NAME: jpcos-1253486782 # Change for yourself
          COS_BUCKET_REGION: ap-tokyo # Change for yourself
        run: coscmd config -a $COS_SECRET_ID -s $COS_SECRET_KEY -b $COS_BUCKET_NAME -r $COS_BUCKET_REGION
      - name: Deploy to COS Bucket
        run: coscmd upload -rfs --delete ./ /
       # run: coscmd upload -rfs --delete public/ /

同步到Backblaze B2

地址:https://www.backblaze.com/cloud-storage

10GB 免费存储空间。

Backblaze B2每月免费 10G 存储及每天 1G 的流量,如果套壳 Cloudflare,流量个人使用等于不要钱。折腾的乐趣,就在于不停的折腾~

Backblaze B2 同步,B2_APPKEY_ID B2_APPKEYApplication Keys菜单下生成就行。要特别注意的是B2_BUCKET写法,完整的写法是b2://xxx,其中xxx为存储桶名称。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 同步到Backblaze B2 
name: Sync B2 Bucket
on: push

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - uses: jakejarvis/backblaze-b2-action@master
      env:
        SOURCE_DIR: './'
        B2_BUCKET: ${{ secrets.B2_BUCKET }}
        B2_APPKEY_ID: ${{ secrets.B2_APPKEY_ID }}
        B2_APPKEY: ${{ secrets.B2_APPKEY }}

所需的环境变量

SOURCE_DIR您想要同步/上传到 B2 的本地目录。例如,./public

B2_BUCKET您要同步到的存储桶的名称。例如,my_files

B2_APPKEY_ID您的 Backblaze 应用程序密钥 ID。在这里生成它。

B2_APPKEY您的 Backblaze 应用程序密钥 — 又名“秘密”密钥。在这里生成它。