用 GitHub Actions 把博客部署到腾讯云 COS

在上一篇文章[1]中,谷月姐费了九牛二虎之力,终于把我的博客(以下简称本博)同时部署到腾讯云 COS、Cloudflare Pages,并用 DNSPod 实现了双线解析域名,把境内访问解析到腾讯云 COS,把境外访问解析到 Cloudflare Pages。

这篇文章记录如何通过 GitHub Actions 来自动部署本博。写完 GitHub Actions Workflow 脚本以后,只需要在本地执行一条 git push 命令,后面的任务由 GitHub Actions 在云端完成。

1. 添加 Actions Secrets

进入 GitHub,打开博客源码仓库 kukmoon_blog,点击仓库上方导航栏的 Settings,点击左侧导航栏 Security 下方的 Secrets → Actions,点击右上方的 New repository secret,添加三个 Secrets:

  • COSBUCKET:存储桶的名称(连同后面的一串数字)。例如本博对应的存储桶是 kukmoon-blog-12345678
  • COSSECRET_ID:API 密钥的 ID。从【「腾讯云控制台」➡「密钥管理」】获取。
  • COSSECRET_KEY:API 密钥,获取方法同 COSSECRET_ID

2. 修改 Actions 工作流脚本

在本地打开并修改 kukmoon_blog/.github/workflows/deploy.yaml,其中 kukmoon_blog 是博客源文件所在的本地文件夹。

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
name: CI

# 只监听 master 分支的改动
on:
push:
branches:
- master

# 自定义环境变量
env:
GIT_USER: Kukmoon
GIT_EMAIL: [email protected]

# 每个 jobs 分别同时在独立的运行器(虚拟机)中运行
jobs:
deploy_to_All:
# 1. Build
# 2. Deploy to GitHub pages, and then checkouted and deployed to CF Pages
# 3. Deploy to CF Workers
# 4. Replace URLs of images and deploy to the Web hosting service using CPanel

name: Build'n'deploy
runs-on: ubuntu-20.04
env:
VPS2: my.vps.banwagong.com
strategy:
matrix:
os: [ubuntu-20.04]
node_version: [20]

steps:
# 检出(获取博客源码和主题)
- name: Checkout
uses: actions/checkout@v4
# 用 checkout 检出仓库,是把仓库里所有的文件,保存到了虚拟主机的 /home/runner/work/kukmoon_blog/kukmoon_blog 目录,
# 这个目录对应的环境变量是 $GITHUB_WORKSPACE
# 可以直接在这里执行 git push,推送到其他的远端仓库
# 如果有子模块(例如主题),需要设置 with: submodules: 'true'。我已经不用子模块了,姑且跳过。

# 用 Node.js 20 渲染
- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node_version }}

# 安装 Hexo-cli
- name: Install hexo
run: |
npm install -g hexo-cli

# 安装依赖
- name: Install dependencies
run: |
npm install

# 配置环境(用于通过SSH协议部署到GitHub和虚拟主机)
- name: Configuration environment
env:
HEXO_DEPLOY_PRI: ${{secrets.HEXO_DEPLOY_PRI}}
run: |
sudo timedatectl set-timezone "Asia/Shanghai"
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
# 从 GitHub 获取公钥并保存到 known_hosts 文件
ssh-keyscan github.com >> ~/.ssh/known_hosts
# 从 VPS 获取公钥并保存到 known_hosts 文件
ssh-keyscan ${VPS2} >> ~/.ssh/known_hosts
git config --global user.name $GIT_USER
git config --global user.email $GIT_EMAIL

# 生成静态页面文件
- name: Generate hexo
run: |
hexo clean
hexo g

# 部署到 GitHub Pages
- name: Deploy to GitHub Pages
run: |
cd ${GITHUB_WORKSPACE}/public
git init
git config --global user.name $GIT_USER
git config --global user.email $GIT_EMAIL
git add .
git commit -m "Deploy to GitHub Pages at $(date +'%Y-%m-%d %H:%M:%S')"
git push --force --set-upstream [email protected]:Kukmoon/kukmoon.github.io.git master # 避免出现 exit code 128

# 安装腾讯云 COS 命令行工具 coscmd,因为 GitHub Actions 的运行器自带 Python 运行环境,所以可以直接用 pip 安装
- name: Install COSCMD
run: |
pip install coscmd

# 用 coscmd config 命令生成腾讯云 COS 配置文件,注意此处用到了 Action Secrets
- name: Generate config file for COSCMD
run: |
coscmd config -a ${{ secrets.COSSECRET_ID }} -s ${{ secrets.COSSECRET_KEY }} -b ${{ secrets.COSBUCKET }} -r ap-hongkong

# 部署到腾讯云 COS
- name: Deploy to Tencent Cloud COS
run: |
cd ${GITHUB_WORKSPACE}/public
# 注意:如果 `.` 后面不加 `/`,就会把当前目录下的所有文件上传到 COS 根目录下面的一个名为 `.` (目录名只有一个点)的子目录,而不是上传到根目录
# -rfs 表示递归上传(r)、同名文件不提示直接覆盖(f)、不上传MD5相同的同名文件(s)
# --delete 表示让远端文件与本地文件同步,即删除仅在远端存在但本地不存在的文件
# --ignore 表示不需要上传的文件,可以用通配符,如果有多组文件不需要上传,就要使用多个 --ignore 参数
coscmd upload -rfs --delete ./ / --ignore "*.DS_Store" --ignore "*.git*"

# 先改图床,然后,部署到 VPS (改了 SSH 端口)
- name: Deploy to VPS
run: |
pwd
sed -i 's/https:\/\/img.kukmoon.com/https:\/\/clouddrive.kukmoon.com\/OneDrive2\/github\/img/g' `grep https:\/\/img.kukmoon.com -rl ./source/_posts/*.md` # 修改图床的 URL
hexo clean
hexo g
cd ${GITHUB_WORKSPACE}/public
pwd
git init
git config --global user.name $GIT_USER
git config --global user.email $GIT_EMAIL
git add .
git commit -m "Deploy to VPS at $(date +'%Y-%m-%d %H:%M:%S')"
git push --force --set-upstream ssh://git@${VPS2}/var/repo/blog.git master # 避免出现 exit code 128

修改完毕后,git addgit commitgit push 三连。

图片来源

题图:GitHub Actions 的著作权、商标权等权利归 GitHub 所有。

头图:Image by Micha Sager from Pixabay

参考文献


求扫码打赏
“我这么可爱,请给我钱 o(*^ω^*)o”

用 GitHub Actions 把博客部署到腾讯云 COS
https://blog.kukmoon.com/a21035aed7e1/
作者
Kukmoon谷月
发布于
2024年6月27日
许可协议