需求来源

我创建了一个在线笔记本(待补充),通过编写markdown文件来生成网页笔记本。并且支持双向链接和引用拓扑图。客户端使用obisdian。

内容使用的是github托管+webdav同步。由github的commit触发vercel的网页部署。 编辑结束后,需要自动(或手动)提交到github和webdav远端。 目前运行良好。

问题

  • 在某些网络环境下,电脑并不能直接push到github
  • obisdian需要同时安装remote sync和github两个插件

解决方案

使用github的action,定期自动从webdav拉取文件,并比较变更后push到本仓库内(如果没有变更则不会commit和push)。由于触发了commit和push,vercel也会同时触发构建。

注意事项

  1. 打开开启/settings/actions里的Read and write permissions,否则无法推送
  2. 在项目settings/secrets/actions里添加4个变量:
key值含义
TARGET_DIR_IN_REPO同步到仓库的哪个文件夹内,不填则为根目录
WEBDAV_URLwebdav服务器的链接
WEBDAV_USERwebdav服务器的用户名
WEBDAV_PASSWORDwebdav服务器的密码
  1. 添加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