From cfaf48ed5db841d80aad71529abb1fd4d292d3e9 Mon Sep 17 00:00:00 2001 From: ymq Date: Fri, 14 Aug 2026 14:22:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=BF=9C=E7=A8=8B=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E5=89=8D=20mkdir=20-p=EF=BC=88=E7=9B=B8=E5=AF=B9=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E5=A4=9A=E7=BA=A7=E7=9B=AE=E5=BD=95=20rsync=20?= =?UTF-8?q?=E4=B8=8D=E9=80=92=E5=BD=92=E5=BB=BA=E7=88=B6=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pipeline_service/work_env.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pipeline_service/work_env.py b/pipeline_service/work_env.py index b432bc3..70d2b52 100644 --- a/pipeline_service/work_env.py +++ b/pipeline_service/work_env.py @@ -204,6 +204,19 @@ def _validate_remote(remote_config: dict) -> str: # 目录迁移 # ═══════════════════════════════════════════════════════════ +async def _remote_mkdir(env: dict, remote_dir: str) -> bool: + """远程 mkdir -p(相对路径可能多级,rsync 不会递归建父目录)。失败返回 False。""" + try: + target = _ssh_target(env) + ssh_cmd = ["ssh"] + _ssh_common_args(env) + [target, "mkdir -p " + shlex.quote(remote_dir)] + proc = await asyncio.create_subprocess_exec( + *ssh_cmd, stdout=asyncio.subprocess.DEVNULL, stderr=asyncio.subprocess.DEVNULL) + await asyncio.wait_for(proc.communicate(), timeout=30) + return proc.returncode == 0 + except Exception: + return False + + async def migrate_work_dir(account_name: str, from_mode: str, to_mode: str, env: dict) -> dict: """把工作目录内容从旧环境迁移到新环境。 @@ -231,6 +244,7 @@ async def migrate_work_dir(account_name: str, from_mode: str, to_mode: str, env: remote_dir = env.get("remote_dir", "") if not remote_dir: return {"ok": False, "error": "缺少远程目录 remote_dir"} + await _remote_mkdir(env, _resolve_remote_dir(remote_dir)) target = _ssh_target(env) + ":" + _resolve_remote_dir(remote_dir) cmd = ["rsync", "-az", "--delete", "-e", "ssh " + " ".join(_ssh_common_args(env)),