From 4d39afd23f84e151bc03488cf47661b3ba9db843 Mon Sep 17 00:00:00 2001 From: HenryDu8133 <813367384@qq.com> Date: Sat, 12 Sep 2026 00:54:20 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20replace=20heredoc-based=20ENV=5FSH?= =?UTF-8?q?=20with=20printf=20%q=20pipe=20=E2=86=92=20resolve=20yaml=20L54?= =?UTF-8?q?4=20could=20not=20find=20expected=20':'=20colon=20false-positiv?= =?UTF-8?q?e=20+=20bash=20-s=20positional=20arg=20for=20env=20source?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/deploy.yml | 37 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index acfbcaa..4b4df13 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -536,34 +536,21 @@ jobs: # 本地预检查:ssh 先连上跑 whoami 确认连通,避免 20 分钟后才发现连不上 ssh "${SSH_OPTS[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" "whoami; docker --version; docker compose version" - # 关键修复:远端 bash 前置 ENV=val 语法在 dash/sh 远端不认, - # 改为先把变量用 printf 写到远端 /tmp/deploy_env.$$ 再远端 source 它,100% 可靠 + # 关键修复:远端 bash 前置 ENV=val 语法在 dash/sh 远端不认,变量全空。 + # 用 printf + \n 拼接完整 shell 脚本通过 stdin 注入到 ssh 远端 cat, + # 不用 heredoc,避免 YAML 冒号/缩进解析误判。 ENV_SH="/tmp/deploy_env_$$" - # 注意:${IMAGE_NEW} / ${DEPLOY_PATH} 等在本地 shell 展开,不是远端,所以 heredoc 用 "" 双引号 - ssh "${SSH_OPTS[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" "cat > ${ENV_SH}" < ${ENV_SH}" echo "[Deploy] env script written to ${ENV_SH} on remote" + # 立即回读验证远端文件非空 & IMAGE_NEW 非空,避免后面空跑 + ssh "${SSH_OPTS[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" "set -e; ls -la ${ENV_SH}; grep -q IMAGE_NEW ${ENV_SH} && echo '[Deploy] env_sh IMAGE_NEW line OK'" - ssh "${SSH_OPTS[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" \ - "chmod +x ${ENV_SH} && bash -c 'source ${ENV_SH} && rm -f ${ENV_SH}'" <<'REMOTE_SCRIPT' - # 注意:上面 source 的环境变量会自动继承到后面的 REMOTE_SCRIPT bash 子进程中 - true -REMOTE_SCRIPT - - # 再次用 bash 显式 source env,然后执行真正的 deploy 脚本(双源保证) - ssh "${SSH_OPTS[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" "bash -s -- ${ENV_SH}" <<'REMOTE_SCRIPT_MAIN' + # ssh 远端 bash -s 第一个参数传 $ENV_SH 路径,主脚本 source 它并做非空断言 + ssh "${SSH_OPTS[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" "bash -s -- '${ENV_SH}'" <<'REMOTE_SCRIPT_MAIN' set -euxo pipefail ENV_SH="$1" if [ -f "$ENV_SH" ]; then