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