mycpen

Mycpen

记录学习历程与受益知识
github
telegram
bilibili

10_Hexo-GitHub Actions 自動更新多吉云 CDN キャッシュ

前言#

之前一直通过 多吉云控制台 手动刷新博客全站 CDN 缓存,CDN 源站为 Vercel 部署的网址

空梦:全自动博客部署方案 这篇文章萌生了自动化的念头,且这些 CDN 服务商都提供了相应的 API 文档和代码样例,开箱即用

仓库示例:https://github.com/mycpen/blog/tree/main/.github

个人示例#

1. 新增 Workflow 文件#

以我为例,新增 source/.github/workflows/refresh-dogecloud.yml 文件,内容如下:

# このワークフローは、Pythonの依存関係をインストールし、テストを実行し、単一のPythonバージョンでリンティングを行います
# 詳細については、次を参照してください: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python

name: Refresh dogecloud CDN

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: szenius/set-timezone@v1.0 # 実行環境のタイムゾーンを設定
        with:
          timezoneLinux: "Asia/Shanghai"
      - name: Set up Python 3.10
        uses: actions/setup-python@v3
        with:
          python-version: "3.10"
      - name: Wait for 3 minutes
        run: sleep 180 # 3分待機、単位は秒
      - name: Run refresh script
        env:
            ACCESS_KEY: ${{ secrets.ACCESS_KEY }}
            SECRET_KEY: ${{ secrets.SECRET_KEY }}
        run: |
          pip install requests
          python .github/refresh-dogecloud.py

2. 新增 PY 脚本:刷新缓存#

以我为例,新增 source/.github/refresh-dogecloud.py 文件,内容如下:

脚本里的 url_list 为需要刷新的目录,需手动修改为自己的。代码来自多吉云 API 验证刷新目录任务

from hashlib import sha1
import hmac
import requests
import json
import urllib
import os

def dogecloud_api(api_path, data={}, json_mode=False):
    """
    多吉云APIを呼び出す

    :param api_path:    呼び出すAPIインターフェースのアドレス、URLリクエストパラメータQueryStringを含む、例えば:/console/vfetch/add.json?url=xxx&a=1&b=2
    :param data:        POSTのデータ、辞書、例えば {'a': 1, 'b': 2}、このパラメータを渡すとGETリクエストではなくPOSTリクエストになります
    :param json_mode:   データdataがJSON形式でリクエストされるかどうか、デフォルトはfalseでフォーム形式(a=1&b=2)を使用

    :type api_path: string
    :type data: dict
    :type json_mode bool

    :return dict: 戻り値のデータ
    """

    # ここをあなたの多吉云の永久AccessKeyとSecretKeyに置き換えてください。ユーザーセンター - キー管理で確認できます
    # クライアントでAccessKeyとSecretKeyを公開しないでください。そうしないと、悪意のあるユーザーがアカウントの完全な制御権を得ることになります
    access_key = os.environ["ACCESS_KEY"]
    secret_key = os.environ["SECRET_KEY"]

    body = ''
    mime = ''
    if json_mode:
        body = json.dumps(data)
        mime = 'application/json'
    else:
        body = urllib.parse.urlencode(data) # Python 2では直接urllib.urlencodeを使用できます
        mime = 'application/x-www-form-urlencoded'
    sign_str = api_path + "\n" + body
    signed_data = hmac.new(secret_key.encode('utf-8'), sign_str.encode('utf-8'), sha1)
    sign = signed_data.digest().hex()
    authorization = 'TOKEN ' + access_key + ':' + sign
    response = requests.post('https://api.dogecloud.com' + api_path, data=body, headers = {
        'Authorization': authorization,
        'Content-Type': mime
    })
    return response.json()


url_list = [
    "https://cpen.top/",
]

api = dogecloud_api('/cdn/refresh/add.json', {
    'rtype': 'path',
    'urls': json.dumps(url_list)
})
if api['code'] == 200:
    print(api['data']['task_id'])
else:
    print("api failed: " + api['msg']) # 失敗

3. 新增 Secrets 变量#

Actions 新增 2 个 Secrets 变量,ACCESS_KEYSECRET_KEY,对应的值在 多吉云 用户中心 - 密钥管理 中查看。link

image-20230502225346425

避免因权限问题导致工作流执行失败,也可以设置下 Actions 读写权限

image-20230502225900571

4. 新增 JS 代码:复制 .github#

前言:source/.github 这类。开头的隐藏文件默认是不会被 hexo generate 渲染生成到 public 目录下的。网上和 ChatGPT 给出的解决办法大多试了(如 skip_render),没有生效,打算直接用 JS 代码将 source/.github 目录复制到 public/.github 目录下。以下代码每次 hexo generate 之后能实现复制的效果

以我为例,新增 scripts/before_generate.js 文件,内容如下:

const fs = require('fs-extra');
const path = require('path');

function copyFolder(source, target) {
  // ターゲットフォルダーが存在しない場合は作成
  fs.ensureDirSync(target);

  // ソースフォルダー内のファイルのリストを取得
  const files = fs.readdirSync(source);

  // 各ファイルをループしてターゲットフォルダーにコピー
  files.forEach((file) => {
    const sourcePath = path.join(source, file);
    const targetPath = path.join(target, file);

    if (fs.statSync(sourcePath).isDirectory()) {
      // サブフォルダーを再帰的にコピー
      copyFolder(sourcePath, targetPath);
    } else {
      // ファイルをコピー
      fs.copyFileSync(sourcePath, targetPath);
    }
  });
}

copyFolder('./source/.github', './public/.github');

5. 更新 _config.yml 配置#

hexo deploy がレンダリングされた静的リポジトリを Github にプッシュするとき、デフォルトでは。で始まる隠しファイルのプッシュがキャンセルされます。具体的には次のとおりです:

image-20230502224949276

Hexo の設定ファイル_config.ymlを修正し、git デプロイアーにignore_hidden設定項目を追加します。サンプルは以下の通りです:

# デプロイメント
## ドキュメント: https://hexo.io/docs/one-command-deployment
deploy:
  - type: git
    repository: git@github.com:mycpen/blog.git
    branch: main
    commit: サイトが更新されました
    message: "{{ now('YYYY/MM/DD') }}"
+    ignore_hidden: false

参考リンク#

  1. 多吉云:API 検証メカニズム(Python)
  2. 多吉云:SDK ドキュメント - リフレッシュプリロード
  3. ChatGPT(deploy.ignore_hidden、js コード コピー ディレクトリ、sleep)
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。