fix(ci): 修复 deploy.yml YAML 语法错误(line 177 could not find expected ':'),消除 heredoc 与块标量缩进冲突
- 根因: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:
+14
-16
@@ -163,6 +163,8 @@ jobs:
|
|||||||
# ========== 关键修复:宿主机 Docker daemon 先注入国内 registry mirrors ==========
|
# ========== 关键修复:宿主机 Docker daemon 先注入国内 registry mirrors ==========
|
||||||
# 原因:Runner 任何 docker pull / buildx create(moby/buildkit 拉基础镜像)都要先经过 daemon
|
# 原因:Runner 任何 docker pull / buildx create(moby/buildkit 拉基础镜像)都要先经过 daemon
|
||||||
# 如果直接连 docker.io,国内会被限速到 <200KB/s,导致 Setup / BuildKit 拉镜像一直卡。
|
# 如果直接连 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"
|
DOCKER_DAEMON_CONF="/etc/docker/daemon.json"
|
||||||
if command -v docker >/dev/null 2>&1 && command -v sudo >/dev/null 2>&1; then
|
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
|
sudo mkdir -p /etc/docker 2>/dev/null || true
|
||||||
@@ -170,27 +172,23 @@ jobs:
|
|||||||
if [ -f "${DOCKER_DAEMON_CONF}" ]; then
|
if [ -f "${DOCKER_DAEMON_CONF}" ]; then
|
||||||
OLD_MIRRORS_JSON="$(sudo cat "${DOCKER_DAEMON_CONF}" 2>/dev/null || echo "{}")"
|
OLD_MIRRORS_JSON="$(sudo cat "${DOCKER_DAEMON_CONF}" 2>/dev/null || echo "{}")"
|
||||||
fi
|
fi
|
||||||
# 用 python3 合成合法 JSON(避免 bash 手搓 JSON 转义坑)
|
PY_CODE=' import json, sys
|
||||||
NEW_DAEMON_JSON="$(
|
try:
|
||||||
python3 - "$OLD_MIRRORS_JSON" \
|
|
||||||
"${DOCKER_REGISTRY_MIRROR_1}" "${DOCKER_REGISTRY_MIRROR_2}" "${DOCKER_REGISTRY_MIRROR_3}" <<'PY'
|
|
||||||
import json, sys
|
|
||||||
try:
|
|
||||||
data = json.loads(sys.argv[1] or "{}")
|
data = json.loads(sys.argv[1] or "{}")
|
||||||
except Exception:
|
except Exception:
|
||||||
data = {}
|
data = {}
|
||||||
mirrors_envs = [m for m in sys.argv[2:5] if m]
|
mirrors_envs = [m for m in sys.argv[2:5] if m]
|
||||||
existing = data.get("registry-mirrors") or []
|
existing = data.get("registry-mirrors") or []
|
||||||
if isinstance(existing, list):
|
if isinstance(existing, list):
|
||||||
combined = list(dict.fromkeys([*mirrors_envs, *existing]))
|
combined = list(dict.fromkeys([*mirrors_envs, *existing]))
|
||||||
else:
|
else:
|
||||||
combined = mirrors_envs
|
combined = mirrors_envs
|
||||||
if combined:
|
if combined:
|
||||||
data["registry-mirrors"] = combined
|
data["registry-mirrors"] = combined
|
||||||
data.setdefault("log-driver", "json-file")
|
data.setdefault("log-driver", "json-file")
|
||||||
print(json.dumps(data, ensure_ascii=False, indent=2))
|
print(json.dumps(data, ensure_ascii=False, indent=2))'
|
||||||
PY
|
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 "${NEW_DAEMON_JSON}" | sudo tee "${DOCKER_DAEMON_CONF}" >/dev/null
|
||||||
echo "[Docker] daemon.json 已注入 registry-mirrors:"
|
echo "[Docker] daemon.json 已注入 registry-mirrors:"
|
||||||
sudo cat "${DOCKER_DAEMON_CONF}" 2>/dev/null || true
|
sudo cat "${DOCKER_DAEMON_CONF}" 2>/dev/null || true
|
||||||
|
|||||||
Reference in New Issue
Block a user