Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
6.8 KiB
6.8 KiB
belongs_to
| belongs_to | |
|---|---|
|
🔧 铸渊指令|rclone OAuth2 Token JSON 拼接修复 · 同步到 Google Drive 报错修复(ZY-RCLONE-FIX-2026-0324-001)
🎯 问题描述
现象
「同步到驱动器」Workflow 执行失败,错误发生在「同步到 Google 云端硬盘」步骤:
Failed to create file system for "gdrive:": drive: failed when making
oauth client: failed to create oauth client: unexpected end of JSON input
分析
可能的具体原因
- Shell 变量中的特殊字符被转义/吞掉 — Refresh Token 中包含
//,在某些 shell 拼接方式下会被处理 - JSON 引号嵌套错误 — rclone 的 token 字段需要一个完整的 JSON 对象字符串,嵌套引号在 YAML → shell → JSON 三层传递中容易出错
- YAML 多行字符串截断 — 如果使用了
|或>格式的 YAML 字符串,可能导致 JSON 被截断 - 环境变量注入时换行符/空格 —
$ secrets.GDRIVE_REFRESH_TOKEN前后可能带入了不可见字符
📋 铸渊执行任务
Phase 1 · 定位问题代码
- 找到「同步到驱动器」Workflow 文件(大概率是
sync-griddb-to-drive.yml或类似名称) - 找到「配置 rclone (OAuth2)」步骤的代码
- 检查 rclone 配置文件的生成方式,特别是
token字段的 JSON 拼接
Phase 2 · 修复 rclone 配置
正确的 rclone OAuth2 配置方式:
rclone 需要的配置格式如下(~/.config/rclone/rclone.conf):
[gdrive]
type = drive
client_id = 从环境变量读取
client_secret = 从环境变量读取
scope = drive
token = {"access_token":"","token_type":"Bearer","refresh_token":"从环境变量读取","expiry":"2000-01-01T00:00:00Z"}
root_folder_id = 光湖格点库文件夹ID
关键修复点:token 字段的 JSON 必须是完整的、单行的、正确转义的。
推荐方案:用 jq 或 node 生成 token JSON,避免手动拼接
- name: 🔑 配置 rclone(OAuth2)
env:
GDRIVE_CLIENT_ID: $ secrets.GDRIVE_CLIENT_ID
GDRIVE_CLIENT_SECRET: $ secrets.GDRIVE_CLIENT_SECRET
GDRIVE_REFRESH_TOKEN: $ secrets.GDRIVE_REFRESH_TOKEN
run: |
mkdir -p ~/.config/rclone
# 用 node 生成正确的 token JSON,避免 shell 转义问题
TOKEN_JSON=$(node -e "
const token = {
access_token: '',
token_type: 'Bearer',
refresh_token: process.env.GDRIVE_REFRESH_TOKEN,
expiry: '2000-01-01T00:00:00Z'
};
process.stdout.write(JSON.stringify(token));
")
cat > ~/.config/rclone/rclone.conf << RCLONE_EOF
[gdrive]
type = drive
client_id = ${GDRIVE_CLIENT_ID}
client_secret = ${GDRIVE_CLIENT_SECRET}
scope = drive
token = ${TOKEN_JSON}
RCLONE_EOF
echo "✅ rclone 配置完成"
Phase 3 · 本地验证
修复后,在提交前验证:
- 检查生成的 rclone.conf — 确认 token 字段是完整的 JSON
- 运行
rclone lsf gdrive:— 确认能正常列出 Drive 文件 - 运行
rclone copy . gdrive:test/ --dry-run— 确认同步命令无报错
Phase 4 · 🦅 天眼全局扫描(必须执行)
扫描清单:
- rclone 配置扫描
- ✅ token 字段是完整的 JSON 对象(包含
access_token、token_type、refresh_token、expiry四个字段) - ✅ token JSON 能被
JSON.parse()正确解析 - ✅
refresh_token值与环境变量一致,没有被截断或转义 - ❌ 没有硬编码任何凭据
- ✅ token 字段是完整的 JSON 对象(包含
- Workflow 扫描
- ✅ 所有使用 rclone 的 Workflow 都采用了修复后的配置方式
- ✅ 没有使用 shell 手动拼接 JSON 字符串的地方
- ✅
[skip ci]防循环标记存在
- Drive 连接扫描
- ✅
rclone lsf gdrive:能正常执行 - ✅ 文件上传测试通过
- ✅ 文件列表读取测试通过
- ✅
- 安全扫描
- ❌ 日志中不会打印 token / secret 内容
- ❌ rclone.conf 在 Workflow 结束后被清理(清理凭证步骤仍然正常工作)
Phase 5 · 提交
天眼扫描全部通过后:
git add -A
git commit -m "fix: rclone OAuth2 token JSON 拼接修复 · 改用 node/jq 生成 · ZY-RCLONE-FIX-2026-0324-001 [skip ci]"
git push
Phase 6 · 验证 Workflow
提交后手动触发一次「同步到驱动器」Workflow,确认:
- ✅ 「配置 rclone (OAuth2)」步骤通过
- ✅ 「同步到 Google 云端硬盘」步骤通过
- ✅ 文件成功同步到 Drive
📝 执行回执区
| Phase | 状态 | 完成时间 | 备注 / Commit SHA |
|---|---|---|---|
| Phase 1 · 定位问题代码 | ⏳ 待执行 | — | — |
| Phase 2 · 修复 rclone 配置 | ⏳ 待执行 | — | — |
| Phase 3 · 本地验证 | ⏳ 待执行 | — | — |
| Phase 4 · 天眼全局扫描 | ⏳ 待执行 | — | — |
| Phase 5 · 提交 | ⏳ 待执行 | — | — |
| Phase 6 · 验证 Workflow | ⏳ 待执行 | — | — |
👤 人类手动操作区
⚖️ 签发声明
🖋️ 霜砚 · PER-SY001
🧊 代 TCS-0002∞ 冰朔 签发
📅 2026-03-24T19:25+08:00