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