《GitHub Actions + COS 静态网站部署》 应用于我的博客部署上面,发现执行耗时太久。这边我们需要将部署程序优化一下。
我之前采用的是《基于 SCF 的 Hexo 部署》,但是很麻烦的是你要先本地下载依赖还要尽可能的在 CentOS 上面进行打包。虽然前段时间 SCF 推出了在线依赖安装(目前只支持 Node.js),但是这个要你更新代码的时候才会去进行下载依赖。
现在我们将针对遇到的问题进行优化:
上传文件
我是放在广州地域的,GitHub Actions 在国外,国外访问国内肯定是慢的所以耗时比较高。


COS 这边提供一个跨地域复制功能,走的是一个专线,所以速度会快很多。
目前我们需要两个存储桶,一个在国外,另外一个在国内。由于我博客我正式上线了的,所以我要重新创建一个测试。
1 2 3 4 5 6 7 8 9 10 11
| { "ip": "104.209.195.138", "city": "Boydton", "region": "Virginia", "country": "US", "loc": "36.6676,-78.3875", "org": "AS8075 Microsoft Corporation", "postal": "23917", "timezone": "America/New_York", "readme": "https://ipinfo.io/missingauth" }
|
经过多次测试,发现 Actions 的 IP 地址都位于美国弗吉尼亚州。
创建两个桶:


现在需要配置下跨地域同步,进入这个美国地域存储桶的高级配置:




测试:一共180个文件。优化前耗时 4m 39s,优化后只有 15s。
hexo-cli
需要构建一个容器去处理太麻烦了,这边我们自己来安装 hexo。下面代码可能会很迷,可以去看一下最后面完整版。。。
1 2 3 4
| - uses: actions/setup-node@v1 with: node-version: '12.x' - run: npm i hexo-cli -g
|
测试:优化前耗时 1m 4s,优化后只有 7s (其中:actions/setup-node@v1 耗时 4s,npm i hexo-cli -g 耗时 3s)。
jakejarvis/s3-sync-action
关于上传也使用了 COS 官方提供的 COSCMD,不过效果不是很好。
意外发现官方有提供 服务器内置软件列表,在里面发现 AWS CLI 已经是内置软件了,我们不需要安装就可以直接使用了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| - name: AWS CLI Config Init run: | mkdir -p ~/.aws touch ~/.aws/credentials echo "[default] aws_access_key_id=${{ secrets.SecretId }} aws_secret_access_key=${{ secrets.SecretKey }}" > ~/.aws/credentials - name: AWS CLI Upload run: | aws s3 sync public s3://actions-blog-us-1252156936 \ --no-progress \ --follow-symlinks \ --size-only \ --delete \ --endpoint-url https://cos.na-ashburn.myqcloud.com - name: AWS CLI Config Clear run: cat /dev/null > ~/.aws/credentials
|
使用 COSCMD 我们需要先构建 Python 环境然后才能安装 COSCMD,这一步的时间就花了 15s。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| - name: Use Python uses: actions/setup-python@v1 with: python-version: '3.x' architecture: 'x64' - name: COSCMD Install run: pip3 install coscmd - name: COSCMD Config Init run: | touch ~/.cos.conf coscmd config \ -a ${{ secrets.SecretId }} \ -s ${{ secrets.SecretKey }} \ -b actions-blog-us-1252156936 \ -r na-ashburn - name: COSCMD Upload run: coscmd upload -rs public/ / - name: COSCMD Config Clear run: cat /dev/null > ~/.cos.conf
|
测试: AWS CLI 从初始化到上传完成清除配置耗时 4s。 COSCMD 从构建 Python 环境到清除配置耗时 26s。
代码
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 64
| name: Deploy Hexo on: push: branches: - master
jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - uses: actions/cache@v1 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Use Node.js uses: actions/setup-node@v1 with: node-version: '12.x' registry-url: 'https://registry.npmjs.org' - name: Use Python uses: actions/setup-python@v1 with: python-version: '3.x' architecture: 'x64' - name: Npm Install run: | npm install npm i hexo-cli -g - name: Hexo Generate run: hexo g -f - name: AWS CLI Config Init run: | mkdir -p ~/.aws touch ~/.aws/credentials echo "[default] aws_access_key_id=${{ secrets.SecretId }} aws_secret_access_key=${{ secrets.SecretKey }}" > ~/.aws/credentials - name: AWS CLI Upload run: | aws s3 sync public s3://actions-blog-us-1252156936 \ --no-progress \ --follow-symlinks \ --size-only \ --delete \ --endpoint-url https://cos.na-ashburn.myqcloud.com - name: AWS CLI Config Clear run: cat /dev/null > ~/.aws/credentials - name: TCCLI Install run: pip3 install tccli - name: TCCLI Config Init run: | tccli configure set secretId ${{ secrets.SecretId }} tccli configure set secretKey ${{ secrets.SecretKey }} tccli configure set region na-ashburn - name: TCCLI Run run: tccli cdn PurgePathCache --endpoint cdn.tencentcloudapi.com --Paths '["https://hongfs.cn", "https://www.hongfs.cn"]' --FlushType flush - name: TCCLI Config Clear run: | tccli configure set secretId null tccli configure set secretKey null tccli configure set region null
|
发现会遇到缓存所以加了个 TCCLI 去清除下缓存。
参考
腾讯云对象存储:基于跨地域复制的容灾高可用架构
腾讯云对象存储:跨地域复制概述
腾讯云TCCLI
腾讯云CDN:刷新目录
GitHub:Software installed on GitHub-hosted runners
AWS CLI: s3 sync