GitHub Actions + COS 优化部署

GitHub Actions + COS 优化部署

《GitHub Actions + COS 静态网站部署》 应用于我的博客部署上面,发现执行耗时太久。这边我们需要将部署程序优化一下。

我之前采用的是《基于 SCF 的 Hexo 部署》,但是很麻烦的是你要先本地下载依赖还要尽可能的在 CentOS 上面进行打包。虽然前段时间 SCF 推出了在线依赖安装(目前只支持 Node.js),但是这个要你更新代码的时候才会去进行下载依赖。

现在我们将针对遇到的问题进行优化:

上传文件

我是放在广州地域的,GitHub Actions 在国外,国外访问国内肯定是慢的所以耗时比较高。

跨地域复制的容灾备份架构示意图

COS 这边提供一个跨地域复制功能,走的是一个专线,所以速度会快很多。

目前我们需要两个存储桶,一个在国外,另外一个在国内。由于我博客我正式上线了的,所以我要重新创建一个测试。

1
$ curl ipinfo.io
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 # 安装 COSCMD
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

往上