GitHub Action 将图床仓库同步到 OneDrive 网盘

GitHub Action 将图床仓库同步到 OneDrive 网盘

需求分析

当笔者更新 本博 (向 Github 的 Kukmoon/kukmoon_blog 仓库推送新内容)时,把图床(GitHub 的 Kukmoon/img 仓库)里的全部内容,借助 Rclone 同步到 OneDrive 网盘。

实现思路

有两种解决方案,一是用 rclone sync 命令,二是用 fuse + rclone mount + git pull。笔者采用了前者。

准备工作

  1. 按照这篇教程 [1],配置 OneDrive。笔者为 OneDrive 配置的盘符为 onedrive_z

  2. C:\Users\你的用户名\.config\rclone\rclone.conf 单独压缩为 rclone.zip(压缩包里只有这一个文件,没有文件夹结构) ,并设置密码。

  3. rclone.zip 文件的密码写入Repo secret。打开笔者的博客仓库 Kukmoon/kukmoon_blog,点击 Settings and variables ➡️ Actions ➡️ New repository secret,Name 设置为 RC_PASSWD,在 Value 框中填入 rclone.zip 文件的密码,然后点击 Add Secret 按钮。

  4. rclone.zip 上传到 Kukmoon/img 仓库的根目录。(注意,是上传到 img 仓库的根目录,不是 kukmoon_blog 仓库

解决方案一:rclone sync

将下列代码另存为 Kukmoon/kukmoon_blog 仓库的 /.github/workflows/deploy.yml 文件。

如果同名文件已存在,将下列代码从第 17 行到最后的文本复制粘贴到该文件的末尾;注意:每行开头的空格不能删也不能乱,因为 YAML 文件是根据每行开始的空格数量划分代码的逻辑结构的。

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
name: CI

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

# 自定义环境变量
env:
GIT_USER: Kukmoon
GIT_EMAIL: kukmoon@outlook.ie

# jobs: 节下面会有多个 jobs,每个 job 分别同时在独立的虚拟机中运行
jobs:

# 此处为同步图床仓库单开一个 job
sync_img_host_to_other_img_hosts:
name: Sync images from GitHub 2 other img hosts
runs-on: ubuntu-latest
env:
RC_PASSWD: ${{secrets.RC_PASSWD}}
GITHUB_IMGHOST: Kukmoon/img
steps:

# 获取图床 repo 中的图片,actions/checkout 工具可以将 repository 参数指定的仓库拉取到当前虚拟机的 ${GITHUB_WORKPLACE} 目录
- name: GetImg
uses: actions/checkout@v2
with:
repository: 'Kukmoon/img'

# 安装 rclone
# 似乎每个小节开始时,GitHub Action 都会强制把命令的运行目录放在 ${GITHUB_WORKPLACE},所以本小节要先切换到 ~ 目录,以免污染 ${GITHUB_WORKPLACE} 的内容。
- name: Install rclone
run: |
cd ~
curl https://rclone.org/install.sh | sudo bash

# 配置 rclone
# 似乎每个小节开始时,GitHub Action 都会强制把命令的运行目录放在 ${GITHUB_WORKPLACE},要用的 rclone.zip 就在此目录,所以不需要另外找了
- name: Configure rclone
run: |
mkdir -p ~/.config/rclone # 建立配置目录
unzip -P ${RC_PASSWD} rclone.zip -d ~/.config/rclone # 解压配置文件

# 同步到 OneDrive
# 似乎每个小节开始时,GitHub Action 都会强制把命令的运行目录放在 ${GITHUB_WORKPLACE},要同步的图片都在此目录,就不需要另外找了
- name: Sync to OneDrive
run: |
sudo timedatectl set-timezone "Asia/Shanghai" # 更改时区
rclone mkdir onedrive_z:/github/img # 即使存在此目录,也不会产生出错提示
rclone sync ./ onedrive_z:/github/img # 同步到 OneDrive

解决方案二

解决方案二的思路是在 fuse 的帮助下,用 rclone mount 将 OneDrive 挂载为本地盘,然后进入这个本地盘的本地仓库目录,执行 git pull 从 GitHub 的仓库拉取。但是 rclone 的官方文档[3]说,rclone sync 命令在出错时会重试,但是 rclone mount 不会。所以笔者不打算写解决方案二了。

图片版权

题图:自绘,其中 GitHub 和 OneDrive 的图标版权均归 Microsoft 所有。

头图:该图片由PexelsPixabay上发布

参考资料


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

GitHub Action 将图床仓库同步到 OneDrive 网盘
https://blog.kukmoon.com/648c4901874a/
作者
Kukmoon谷月
发布于
2023年3月27日
许可协议