小类随手记

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/[email protected] 这个 注意run 那行我们是 复制 public 文件到 oss://Bucket名称/(Bucket名称) 如果你用其他程序,需要自己修改以下

代码 (32 行)
 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的时候触发

on: push: branches: [ master ] pull_request: branches: [ master ]

1
2
3
4
5
看手册  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

on: schedule: - cron: ‘30 5,17 * * *’

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

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

on: workflow_dispatch:

1
2
3

##### 定时和手动结合
手动加定时任务

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

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

##### 完美:添加时间戳的方法
原理:在阿里云oss上创建一个文本记录上次同步到阿里云的时间戳,然后每次同步到阿里云之前比较一下时间戳,如果超过指定的时间`3600` 那么就同步一次,否则 不执行。
新建一个文件`last_update.txt`内容`last_update=0` 手动上传到阿里云oss
  • 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=$(((timeStamp1000+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
1
同时 修改触发条件为,每次改动,或手动,并添加定时,防止最后一次push后未同步的情况下 不能自动提交给阿里云的情况。

on: workflow_dispatch: schedule: # 第二位小时数,要北京时间-8 后输入 比如 2是10点 - cron: “33 2 * * *” push: branches: [master] pull_request: branches: [master]

1
2
3
4
5

最终文件 [点击这里](https://github.com/joyanhui/file.leiyanhui.com/blob/main/github-actions/hugo/%E9%97%B4%E9%9A%94%E5%90%8C%E6%AD%A5%E5%88%B0%E9%98%BF%E9%87%8C%E4%BA%91oss%E5%92%8C%E8%87%AA%E5%8A%A8%E5%90%8C%E6%AD%A5%E5%88%B0%E7%A7%81%E6%9C%89%E5%BA%93.yaml)

##### 小问题
`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
Theme Stack