需求来源
我创建了一个在线笔记本(待补充),通过编写markdown文件来生成网页笔记本。并且支持双向链接和引用拓扑图。客户端使用obisdian。
内容使用的是github托管+webdav同步。由github的commit触发vercel的网页部署。 编辑结束后,需要自动(或手动)提交到github和webdav远端。 目前运行良好。
问题
- 在某些网络环境下,电脑并不能直接push到github
- obisdian需要同时安装remote sync和github两个插件
解决方案
使用github的action,定期自动从webdav拉取文件,并比较变更后push到本仓库内(如果没有变更则不会commit和push)。由于触发了commit和push,vercel也会同时触发构建。
注意事项
- 打开开启/settings/actions里的Read and write permissions,否则无法推送
- 在项目settings/secrets/actions里添加4个变量:
| key | 值含义 |
|---|---|
| TARGET_DIR_IN_REPO | 同步到仓库的哪个文件夹内,不填则为根目录 |
| WEBDAV_URL | webdav服务器的链接 |
| WEBDAV_USER | webdav服务器的用户名 |
| WEBDAV_PASSWORD | webdav服务器的密码 |
- 添加action的脚本:
.github/workflows/sync.yml:
name: WebDAV Sync
on:
schedule:
- cron: '0 0 * * *' # 每天00:00执行
workflow_dispatch: # 允许手动触发
jobs:
sync_webdav:
runs-on: ubuntu-latest
steps:
# 1. 检出 GitHub 仓库代码
- name: Checkout repository
uses: actions/checkout@v3
# 2. 安装 rclone
- name: Install rclone
run: |
sudo apt-get update
sudo apt-get install -y rclone
# 3. 使用 rclone obscure 加密 WebDAV 密码并配置 rclone
- name: Configure rclone
run: |
mkdir -p ~/.config/rclone
# 生成rclone配置文件并将密码模糊化
echo "[webdav]" > ~/.config/rclone/rclone.conf
echo "type = webdav" >> ~/.config/rclone/rclone.conf
echo "url = ${{ secrets.WEBDAV_URL }}" >> ~/.config/rclone/rclone.conf
echo "vendor = other" >> ~/.config/rclone/rclone.conf
echo "user = ${{ secrets.WEBDAV_USER }}" >> ~/.config/rclone/rclone.conf
echo "pass = $(rclone obscure ${{ secrets.WEBDAV_PASSWORD }})" >> ~/.config/rclone/rclone.conf
# 4. 使用 rclone 同步 WebDAV 文件到本地工作目录
- name: Sync WebDAV content to local
# secrets.TARGET_DIR_IN_REPO 要放置到仓库的哪个目录
run: |
rclone sync webdav:/ ${{ github.workspace }}/${{ secrets.TARGET_DIR_IN_REPO }} --verbose --exclude ".git/**" --exclude ".github/**" --exclude "@eaDir/**" --exclude ".DS_Store" --exclude ".obsidian/**"
# 5. 提交更改并推送到 GitHub
# 6. 请开启/settings/actions里的Read and write permissions,否则无法推送
- name: Commit changes
run: |
echo ${{ github.workspace }}
pwd
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
if [[ `git status --porcelain` ]]; then
git add .
git commit -m "Sync WebDAV content"
git push
else
echo "No changes to commit."
fi