hugo、hexo、mdbook自动部署到GitHub私有库和阿里云oss 并嵌套腾讯cdn的完整方案

本文以hugo为例,hexo同理 实现目的,

  • 无服务器 如同本站
  • 接近0费用 只有cdn和oss费用 cdn本身费用很低 oss 那边看cdn配置和文章更新频繁程度
  • 搭建文章网站。实现博客或者帮助文档在线公开浏览。
  • 国外访客直接走githubpage 国内访客 走腾讯-> 阿里云oss
  • .md原文件 不暴露到公网

部署到 oss 会增加大概100多秒的actions执行时间,也会导致oss那边产生一些写入费用。 我的actions 从一开始的18-25秒执行时间,变成2m30s左右。单独上传到alioss 差不多需要2分钟。

# GitHub上部署hugo 或者mdbook hexo到私有库

hugo : https://dev.leiyanhui.com/mdbook/hugo-install-nolocal/

mdbook: https://dev.leiyanhui.com/mdbook/siyou/

hexo 已经弃用很久,自己搞定 都差不多。

# 在阿里云创建oss和相关key

详细步骤略,主要是 拿到 AccessKey ID AccessKey Secret, 对应的Bucket 权限 应该是所有人可读 我创建了一个 青岛 mydev-bolg.oss-cn-qingdao.aliyuncs.com

在对应的Bucket的配置 域名配置 里面绑定一个临时域名 oss.dev.leiyanhui.com

然后在数据管理静态页面中设置 首页 index.html 打开子目录首页 Redirect 404页面 404.html

# 域名解析部分

  • dev.leiyanhui.com 境外到xxx.gitHub.io
  • dev.leiyanhui.com 境内到cdn,我这里到腾讯cdn

# 修改GitHub私有库上的自动部署脚本

以下操作在github的私有库上操作

# 先配置环境变量

依次点击 /settings/secrets/actions 添加变量OSS_ACCESS_KEY_ID OSS_ACCESS_KEY_SERCRET 对应阿里云的 AccessKey ID AccessKey Secret 原来的变量FOR_PAGE_SSHKEY 参考上面私有库配置的文章。
这样做是为了防止在编译过程日志里面显示敏感信息

# 编辑github actions文件

/.github/workflows/deploy.yml 原始文件内容参考 https://github.com/joyanhui/file.leiyanhui.com/blob/main/github-actions/hugo/hugo-Private-to-public-whis-theme-deploy.yml

添加内容 就是增加一段到alioss的配置 我们用manyuanrong/setup-ossutil@v1.0 这个 注意run 那行我们是 复制 public 文件到 oss://Bucket名称/(Bucket名称) 如果你用其他程序,需要自己修改以下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
            - name: setup aliyun oss
              uses: manyuanrong/setup-ossutil@master
              with:
                  endpoint: oss-cn-qingdao.aliyuncs.com
                  access-key-id:  ${{ secrets.OSS_ACCESS_KEY_ID }} 
                  access-key-secret:  ${{ secrets.OSS_ACCESS_KEY_SERCRET }} 
            - name: cp files to aliyun
              run:  |
                    rm -rf .git*
                    rm -rf public/.git*
                    ossutil cp -rf public oss://mydev-bolg/ # 将mydev-bolg改为创建的Bucket名称,-rf表示覆盖

完整文件:https://github.com/joyanhui/file.leiyanhui.com/blob/main/github-actions/hugo/hugo-Private-to-public-to-Alioss-whis-theme-deploy.yml

# 测试

actions 执行完成后,打开域名mydev-bolg.oss-cn-qingdao.aliyuncs.com 测试,可以打开

# 推送到腾讯cos的配置

没有买cos,感觉贵一些,所以这里没相关配置,实际和上面操作 大同小异

# 配置cdn

我这里cdn用的腾讯的,之所以套一个cdn 而不是直接用alioss 静态页面功能,当然是为了省钱。。。

阿里oss 删掉这个域名,或者直接添加一个 域名 dev.leiyanhui.com

在腾讯cdn 域名管理中 添加 回源地址 GitHub作为 热备源站,主站用oss-cn-qingdao.aliyuncs.com

# 进阶

# 节省oss费用,降低写入次数。 设置为定时执行

默认的情况是 当向master分支push代码或提交pull request的时候触发

1
2
3
4
5
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

看手册 https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows 如果想要实现,push 并且距离上次时间 超过1小时,因为cron 不支持这个操作,而我们acions内的脚本 无法持久保存文件。所以不好实现。

# schedule cron的方式

手册:https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule

1
2
3
on:
  schedule:
    - cron:  '30 5,17 * * *'

可以定时执行,但是也和我们预期效果不一样。因为我们不是每天或者每小时都要更新内容。

# 手动执行发方法

最简单 办法 是用 workflow_dispatch,想同步的时候,手动执行一次

1
2
on:
  workflow_dispatch:
# 定时和手动结合

手动加定时任务

1
2
3
4
5
on:
    workflow_dispatch:
    schedule:
    # 第二位小时数,要北京时间-8 后输入 比如 2是10点
    - cron: "16 5 */3 * *"

手动触发 ,或者 每间隔3天的13点16分自动执行一次

# 完美:添加时间戳的方法

原理:在阿里云oss上创建一个文本记录上次同步到阿里云的时间戳,然后每次同步到阿里云之前比较一下时间戳,如果超过指定的时间3600 那么就同步一次,否则 不执行。 新建一个文件last_update.txt内容last_update=0 手动上传到阿里云oss

 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
 - name: setup aliyun oss
              uses: manyuanrong/setup-ossutil@master
              with:
                  endpoint: oss-cn-qingdao.aliyuncs.com
                  access-key-id:  ${{ secrets.OSS_ACCESS_KEY_ID }} 
                  access-key-secret:  ${{ secrets.OSS_ACCESS_KEY_SERCRET }} 
            - name: cp files to aliyun
              run:  |
                    #获取当前时间戳
                    current=`date "+%Y-%m-%d %H:%M:%S"`
                    timeStamp=`date -d "$current" +%s` 
                    currentTimeStamp=$(((timeStamp*1000+10#`date "+%N"`/1000000)/1000)) #将current转换为时间戳,精确到秒
                    #获取上次更新的时间戳到变量last_update
                    curl -o last_update.txt https://你的地址.oss-cn-qingdao.aliyuncs.com/last_update.txt?$GITHUB_SHA
                    source last_update.txt
                    Time_over_val=`expr $currentTimeStamp - $last_update`
                    if [ "$Time_over_val" -ge "3600" ];then
                        echo "阿里oss 记录时间"
                        echo "last_update=$currentTimeStamp" > public/last_update.txt
                        rm -rf .git*
                        rm -rf public/.git*
                        ossutil cp -rf public oss://你的Bucket/ 
                    else
                        echo "跳过更新阿里oss"
                    fi

同时 修改触发条件为,每次改动,或手动,并添加定时,防止最后一次push后未同步的情况下 不能自动提交给阿里云的情况。

1
2
3
4
5
6
7
8
9
on:
    workflow_dispatch:
    schedule:
    # 第二位小时数,要北京时间-8 后输入 比如 2是10点
    - cron: "33 2 * * *"
    push:
        branches: [master]
    pull_request:
        branches: [master]

最终文件 点击这里

# 小问题

manyuanrong/setup-ossutil@master 是从 http://gosspublic.alicdn.com/ossutil/1.7.7/ossutil64 下载安装,git去下载话 有时候偶尔抽风速度不是很理想。有时候需要4分钟。。占用actions时间。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计