fix(ci): 修复 deploy.yml YAML 语法错误(line 177 could not find expected ':'),消除 heredoc 与块标量缩进冲突
构建并部署 BYW VoiceHub / Preflight 语法与构建检查 (push) Failing after 15m2s
构建并部署 BYW VoiceHub / 构建并推送容器镜像 (push) Skipped
构建并部署 BYW VoiceHub / 部署到生产服务器 (push) Failing after 3s

- 根因:build-image job 注入 Docker daemon.json 时用了 bash heredoc <<'PY'...PY;heredoc 内部 Python 代码在 YAML 文件里缩进为 0,触发 run:| 字面块标量提前结束;Gitea YAML 解析器尝试把下一行解析为新的 key 却找不到冒号 → 抛 line 177 could not find expected ':',整个 workflow 无法触发
- 修复:移除 heredoc 结构,改为 PY_CODE 单引号字符串 + printf '%s' | python3 - stdin 管道传递;单引号内所有 Python 行统一保持与外层 shell 语句一致的 12 spaces 前导缩进(满足 YAML 块标量 ≥ 10 spaces 基础缩进要求);Python 顶级代码统一缩进 12 spaces,块内再缩进 4 spaces,避免 IndentationError
- 验证:IDE YAML 诊断 0 错误;Gitea Actions 页左侧 deploy.yml 红色感叹号应立即消失,可正常触发 run
This commit is contained in:
2026-09-11 22:28:42 +08:00
parent 124280a92f
commit afb4cd3669
+14 -16
View File
@@ -163,6 +163,8 @@ jobs:
# ========== 关键修复:宿主机 Docker daemon 先注入国内 registry mirrors ==========
# 原因:Runner 任何 docker pull / buildx create(moby/buildkit 拉基础镜像)都要先经过 daemon
# 如果直接连 docker.io,国内会被限速到 <200KB/s,导致 Setup / BuildKit 拉镜像一直卡。
# 注意:此处用 PY_CODE 字符串 + printf 管道传 Python 代码给 stdin,
# 避免 <<'PY' heredoc 结构与 YAML run:| 块标量缩进冲突导致的 could not find expected ':' 报错。
DOCKER_DAEMON_CONF="/etc/docker/daemon.json"
if command -v docker >/dev/null 2>&1 && command -v sudo >/dev/null 2>&1; then
sudo mkdir -p /etc/docker 2>/dev/null || true
@@ -170,27 +172,23 @@ jobs:
if [ -f "${DOCKER_DAEMON_CONF}" ]; then
OLD_MIRRORS_JSON="$(sudo cat "${DOCKER_DAEMON_CONF}" 2>/dev/null || echo "{}")"
fi
# 用 python3 合成合法 JSON(避免 bash 手搓 JSON 转义坑)
NEW_DAEMON_JSON="$(
python3 - "$OLD_MIRRORS_JSON" \
"${DOCKER_REGISTRY_MIRROR_1}" "${DOCKER_REGISTRY_MIRROR_2}" "${DOCKER_REGISTRY_MIRROR_3}" <<'PY'
import json, sys
try:
PY_CODE=' import json, sys
try:
data = json.loads(sys.argv[1] or "{}")
except Exception:
except Exception:
data = {}
mirrors_envs = [m for m in sys.argv[2:5] if m]
existing = data.get("registry-mirrors") or []
if isinstance(existing, list):
mirrors_envs = [m for m in sys.argv[2:5] if m]
existing = data.get("registry-mirrors") or []
if isinstance(existing, list):
combined = list(dict.fromkeys([*mirrors_envs, *existing]))
else:
else:
combined = mirrors_envs
if combined:
if combined:
data["registry-mirrors"] = combined
data.setdefault("log-driver", "json-file")
print(json.dumps(data, ensure_ascii=False, indent=2))
PY
)"
data.setdefault("log-driver", "json-file")
print(json.dumps(data, ensure_ascii=False, indent=2))'
NEW_DAEMON_JSON="$(printf '%s\n' "$PY_CODE" | python3 - "$OLD_MIRRORS_JSON" \
"${DOCKER_REGISTRY_MIRROR_1}" "${DOCKER_REGISTRY_MIRROR_2}" "${DOCKER_REGISTRY_MIRROR_3}")"
echo "${NEW_DAEMON_JSON}" | sudo tee "${DOCKER_DAEMON_CONF}" >/dev/null
echo "[Docker] daemon.json 已注入 registry-mirrors:"
sudo cat "${DOCKER_DAEMON_CONF}" 2>/dev/null || true