From f0538fa2337d561c518a99bd34099e8651129ffe Mon Sep 17 00:00:00 2001 From: sloray Date: Thu, 15 Oct 2026 23:06:35 +0800 Subject: [PATCH] =?UTF-8?q?ci:=20Windows=20job=20=E5=8A=A0=20USERPROFILE?= =?UTF-8?q?=20=E9=87=8D=E5=AE=9A=E5=90=91=20=E2=80=94=E2=80=94=20pnpm=20?= =?UTF-8?q?=E7=9A=84=E6=93=8D=E4=BD=9C=E9=94=81=E6=8C=89=E5=AE=83=E7=AE=97?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit run 9 的诊断2 已经把话说死了: LOCALAPPDATA = C:\Users\admin\runner\windows\cache\ci-localappdata <- 重定向生效 OK ...\ci-localappdata\pnpm-store-operation-locks <- 目录能建 Error: ERR_PNPM_STORE_DIR_OPEN_OPERATION_LOCK Failed to open the store operation lock at "C:\Users\admin\AppData\Local\pnpm-store-operation-locks\all-stores.lock" 也就是说 LOCALAPPDATA 指走了,pnpm 还是去开原来那个路径。本机复现出真正的规则: 只改 USERPROFILE(LOCALAPPDATA 不动)、store 换成一个全新的空目录时, <新 USERPROFILE>\AppData\Local\pnpm-store-operation-locks\all-stores.lock <新 USERPROFILE>\AppData\Local\pnpm-store-operation-locks\.lock 立刻出现 —— pnpm 是按 \AppData\Local 算的,跟 LOCALAPPDATA 无关。 所以在那一步里再建一个 ci-profile,把 AppData\Local / AppData\Roaming 先建好,然后 把 USERPROFILE 写进 GITHUB_ENV。文件头第 5 条同步更新。 --- .github/workflows/build-client.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-client.yml b/.github/workflows/build-client.yml index 64e4b94..242428e 100644 --- a/.github/workflows/build-client.yml +++ b/.github/workflows/build-client.yml @@ -79,7 +79,13 @@ # 处置:Windows job 把能重定向的都指到 runner 自己的工作目录 # (C:\Users\admin\runner\windows\cache,job 内写探测实测可写)—— # RUSTUP_HOME / CARGO_HOME / npm_config_cache / npm_config_store_dir / -# RUNNER_TOOL_CACHE,加上 TEMP/TMP/TMPDIR 与 pnpm/action-setup 的 dest。 +# RUNNER_TOOL_CACHE / LOCALAPPDATA / APPDATA,加上 TEMP/TMP/TMPDIR、 +# pnpm/action-setup 的 dest,以及 **USERPROFILE**。 +# 最后这个是被 pnpm 逼出来的:它的 store 操作锁不在 store-dir 下面,也不看 +# LOCALAPPDATA,而是按 \AppData\Local\pnpm-store-operation-locks +# 算 —— 只把 LOCALAPPDATA 指走它照样去开原来的路径(报错原文见 run 8 的日志), +# 把 USERPROFILE 指走它才跟着走(本机实测:探针 profile 下立刻出现 +# all-stores.lock)。 # 想从根上解决:让 gitea-runner 以**中完整性**启动(在普通终端里跑 # run-runner.ps1,而不是从被沙箱化的低完整性 shell 里拉起来),那样这些重定向 # 就都可以撤掉。这台机器上 runner 由计划任务 GiteaRunner-Windows(admin / @@ -438,8 +444,18 @@ jobs: Add-Content -Path $env:GITHUB_ENV -Value "TMP=$tmpRoot" -Encoding ascii Add-Content -Path $env:GITHUB_ENV -Value "TMPDIR=$($tmpRoot -replace '\\', '/')" -Encoding ascii + # 第三个坑:pnpm 的 store 操作锁是按 \AppData\Local\ + # pnpm-store-operation-locks 算的 —— 实测只把 LOCALAPPDATA 指走它不跟, + # 只把 USERPROFILE 指走它就跟着走(换完 USERPROFILE 后探针目录里立刻出现 + # all-stores.lock)。所以 USERPROFILE 也得指到能写的地方,并且先把 + # AppData\Local、AppData\Roaming 建好。 + $profileRoot = Join-Path (Split-Path -Parent $env:GITHUB_WORKSPACE) 'ci-profile' + New-Item -ItemType Directory -Force -Path (Join-Path $profileRoot 'AppData\Local'), (Join-Path $profileRoot 'AppData\Roaming') | Out-Null + Add-Content -Path $env:GITHUB_ENV -Value "USERPROFILE=$profileRoot" -Encoding ascii + "bash = $(Join-Path $gitBash 'bash.exe')" "TEMP/TMP/TMPDIR = $tmpRoot" + "USERPROFILE = $profileRoot" - name: 装 Rust(stable) uses: dtolnay/rust-toolchain@stable