























@@ -41,7 +41,7 @@ env:
4141jobs:
4242hydrate:
4343name: hydrate
44-if: ${{ inputs.crabbox_job != 'hydrate-github' }}
44+if: ${{ inputs.crabbox_job != 'hydrate-github' && inputs.crabbox_job != 'hydrate-windows-daemon' }}
4545runs-on: [self-hosted, "${{ inputs.crabbox_runner_label }}"]
4646timeout-minutes: 120
4747steps:
@@ -131,7 +131,7 @@ jobs:
131131 ln -sfn . "$PNPM_CONFIG_MODULES_DIR/node_modules"
132132 fi
133133134- - name: Prepare Crabbox shell
134+ - name: Fetch main ref
135135shell: bash
136136run: |
137137 set -euo pipefail
@@ -140,6 +140,11 @@ jobs:
140140 git fetch --no-tags --depth=50 origin "+refs/heads/main:refs/remotes/origin/main"
141141 fi
142142143+ - name: Prepare Crabbox shell
144+shell: bash
145+run: |
146+ set -euo pipefail
147+143148 node_bin="$(dirname "$(node -p 'process.execPath')")"
144149 sudo ln -sf "$node_bin/node" /usr/local/bin/node
145150 sudo ln -sf "$node_bin/npm" /usr/local/bin/npm
@@ -245,7 +250,7 @@ jobs:
245250 fi
246251 }
247252 {
248- for key in CI GITHUB_ACTIONS GITHUB_WORKSPACE GITHUB_REPOSITORY GITHUB_RUN_ID GITHUB_RUN_NUMBER GITHUB_RUN_ATTEMPT GITHUB_REF GITHUB_REF_NAME GITHUB_SHA GITHUB_EVENT_NAME GITHUB_ACTOR RUNNER_OS RUNNER_ARCH RUNNER_TEMP RUNNER_TOOL_CACHE XDG_CACHE_HOME COREPACK_HOME PNPM_HOME PNPM_CONFIG_CHILD_CONCURRENCY PNPM_CONFIG_MODULES_DIR PNPM_CONFIG_NETWORK_CONCURRENCY PNPM_CONFIG_STORE_DIR PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN PNPM_CONFIG_VIRTUAL_STORE_DIR; do
253+ for key in CI GITHUB_ACTIONS GITHUB_WORKSPACE GITHUB_REPOSITORY GITHUB_RUN_ID GITHUB_RUN_NUMBER GITHUB_RUN_ATTEMPT GITHUB_REF GITHUB_REF_NAME GITHUB_SHA GITHUB_EVENT_NAME GITHUB_ACTOR RUNNER_OS RUNNER_ARCH RUNNER_TEMP RUNNER_TOOL_CACHE XDG_CACHE_HOME COREPACK_HOME NODE_BIN PNPM_HOME PNPM_CONFIG_CHILD_CONCURRENCY PNPM_CONFIG_MODULES_DIR PNPM_CONFIG_NETWORK_CONCURRENCY PNPM_CONFIG_STORE_DIR PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN PNPM_CONFIG_VIRTUAL_STORE_DIR PATH; do
249254 write_export "$key"
250255 done
251256 } > "${env_file}.tmp"
@@ -292,6 +297,200 @@ jobs:
292297 sleep 15
293298 done
294299300+ hydrate-windows-daemon:
301+name: hydrate-windows-daemon
302+if: ${{ inputs.crabbox_job == 'hydrate-windows-daemon' }}
303+runs-on: [self-hosted, "${{ inputs.crabbox_runner_label }}"]
304+timeout-minutes: 120
305+steps:
306+ - uses: actions/checkout@v6
307+with:
308+ref: ${{ inputs.ref || github.ref }}
309+310+ - name: Setup Node.js
311+uses: actions/setup-node@v6
312+with:
313+node-version: "24"
314+315+ - name: Fetch main ref
316+shell: powershell
317+run: |
318+ $ErrorActionPreference = "Stop"
319+320+ if (git rev-parse --is-inside-work-tree 2>$null) {
321+ git fetch --no-tags --depth=50 origin "+refs/heads/main:refs/remotes/origin/main"
322+ }
323+324+ - name: Setup pnpm and dependencies
325+shell: powershell
326+env:
327+CI: "true"
328+COREPACK_ENABLE_DOWNLOAD_PROMPT: "0"
329+run: |
330+ $ErrorActionPreference = "Stop"
331+332+ $workspace = (Get-Location).Path
333+ $cacheRoot = if ($env:RUNNER_TEMP) { $env:RUNNER_TEMP } else { [System.IO.Path]::GetTempPath() }
334+ $env:XDG_CACHE_HOME = Join-Path $cacheRoot "cache"
335+ $env:COREPACK_HOME = Join-Path $env:XDG_CACHE_HOME "corepack"
336+ $env:PNPM_HOME = Join-Path $cacheRoot "pnpm-home"
337+ $env:PNPM_CONFIG_STORE_DIR = Join-Path $cacheRoot "openclaw-pnpm-store"
338+ $env:PNPM_CONFIG_MODULES_DIR = Join-Path $workspace "node_modules"
339+ $env:PNPM_CONFIG_VIRTUAL_STORE_DIR = Join-Path $workspace "node_modules\.pnpm"
340+ $env:PNPM_CONFIG_CHILD_CONCURRENCY = "4"
341+ $env:PNPM_CONFIG_NETWORK_CONCURRENCY = "8"
342+ $env:PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN = "false"
343+ $env:PNPM_CONFIG_SIDE_EFFECTS_CACHE = "false"
344+ function Add-GitHubCommandLine([string]$Path, [string]$Value) {
345+ $Value | Out-File -FilePath $Path -Encoding utf8 -Append
346+ }
347+ New-Item -ItemType Directory -Force `
348+ $env:XDG_CACHE_HOME, `
349+ $env:COREPACK_HOME, `
350+ $env:PNPM_HOME, `
351+ $env:PNPM_CONFIG_STORE_DIR | Out-Null
352+ $env:PATH = "$env:PNPM_HOME;$env:PATH"
353+ @(
354+ "XDG_CACHE_HOME=$env:XDG_CACHE_HOME"
355+ "COREPACK_HOME=$env:COREPACK_HOME"
356+ "PNPM_HOME=$env:PNPM_HOME"
357+ "PNPM_CONFIG_STORE_DIR=$env:PNPM_CONFIG_STORE_DIR"
358+ "PNPM_CONFIG_MODULES_DIR=$env:PNPM_CONFIG_MODULES_DIR"
359+ "PNPM_CONFIG_VIRTUAL_STORE_DIR=$env:PNPM_CONFIG_VIRTUAL_STORE_DIR"
360+ "PNPM_CONFIG_CHILD_CONCURRENCY=$env:PNPM_CONFIG_CHILD_CONCURRENCY"
361+ "PNPM_CONFIG_NETWORK_CONCURRENCY=$env:PNPM_CONFIG_NETWORK_CONCURRENCY"
362+ "PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN=$env:PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN"
363+ "PNPM_CONFIG_SIDE_EFFECTS_CACHE=$env:PNPM_CONFIG_SIDE_EFFECTS_CACHE"
364+ ) | ForEach-Object { Add-GitHubCommandLine $env:GITHUB_ENV $_ }
365+ Add-GitHubCommandLine $env:GITHUB_PATH $env:PNPM_HOME
366+367+ $packageManager = (Get-Content package.json -Raw | ConvertFrom-Json).packageManager
368+ if (-not $packageManager -or -not $packageManager.StartsWith("pnpm@")) {
369+ Write-Error "Expected packageManager to pin pnpm, got '$packageManager'"
370+ }
371+ corepack enable --install-directory $env:PNPM_HOME
372+ for ($attempt = 1; $attempt -le 3; $attempt++) {
373+ corepack prepare $packageManager --activate
374+ if ($LASTEXITCODE -eq 0) {
375+ break
376+ }
377+ if ($attempt -eq 3) {
378+ exit $LASTEXITCODE
379+ }
380+ Start-Sleep -Seconds ($attempt * 5)
381+ }
382+ $nodeBin = Split-Path -Parent (node -p "process.execPath")
383+ Add-GitHubCommandLine $env:GITHUB_ENV "NODE_BIN=$nodeBin"
384+ Add-GitHubCommandLine $env:GITHUB_PATH $nodeBin
385+ $env:PATH = "$nodeBin;$env:PATH"
386+387+ node -v
388+ npm -v
389+ pnpm -v
390+391+ $installArgs = @(
392+ "install",
393+ "--filter",
394+ "openclaw",
395+ "--prefer-offline",
396+ "--ignore-scripts=true",
397+ "--config.engine-strict=false",
398+ "--config.enable-pre-post-scripts=false",
399+ "--config.side-effects-cache=false",
400+ "--frozen-lockfile",
401+ "--child-concurrency=$env:PNPM_CONFIG_CHILD_CONCURRENCY",
402+ "--modules-dir=$env:PNPM_CONFIG_MODULES_DIR",
403+ "--network-concurrency=$env:PNPM_CONFIG_NETWORK_CONCURRENCY",
404+ "--store-dir=$env:PNPM_CONFIG_STORE_DIR",
405+ "--virtual-store-dir=$env:PNPM_CONFIG_VIRTUAL_STORE_DIR"
406+ )
407+ pnpm @installArgs
408+ if ($LASTEXITCODE -ne 0) {
409+ exit $LASTEXITCODE
410+ }
411+ $corepackShimDir = Join-Path $nodeBin "node_modules\corepack\shims"
412+ if (Test-Path $corepackShimDir) {
413+ $env:PNPM_HOME = $corepackShimDir
414+ Add-GitHubCommandLine $env:GITHUB_ENV "PNPM_HOME=$env:PNPM_HOME"
415+ Add-GitHubCommandLine $env:GITHUB_PATH $env:PNPM_HOME
416+ }
417+418+ - name: Mark Crabbox ready
419+shell: powershell
420+env:
421+CRABBOX_ID: ${{ inputs.crabbox_id }}
422+CRABBOX_JOB: ${{ inputs.crabbox_job }}
423+run: |
424+ $ErrorActionPreference = "Stop"
425+ $job = if ($env:CRABBOX_JOB) { $env:CRABBOX_JOB } else { "hydrate-windows-daemon" }
426+ if (-not $env:CRABBOX_ID -or $env:CRABBOX_ID -notmatch '^[A-Za-z0-9._-]+$') {
427+ Write-Error "Invalid crabbox_id"
428+ }
429+ $actionsRoot = Join-Path $HOME ".crabbox\actions"
430+ New-Item -ItemType Directory -Force $actionsRoot | Out-Null
431+ $state = Join-Path $actionsRoot "$env:CRABBOX_ID.env"
432+ $envFile = Join-Path $actionsRoot "$env:CRABBOX_ID.env.ps1"
433+ $servicesFile = Join-Path $actionsRoot "$env:CRABBOX_ID.services"
434+ $keys = @(
435+ "CI", "GITHUB_ACTIONS", "GITHUB_WORKSPACE", "GITHUB_REPOSITORY",
436+ "GITHUB_RUN_ID", "GITHUB_RUN_NUMBER", "GITHUB_RUN_ATTEMPT",
437+ "GITHUB_REF", "GITHUB_REF_NAME", "GITHUB_SHA", "GITHUB_EVENT_NAME",
438+ "GITHUB_ACTOR", "RUNNER_OS", "RUNNER_ARCH", "RUNNER_TEMP",
439+ "RUNNER_TOOL_CACHE", "XDG_CACHE_HOME", "COREPACK_HOME", "NODE_BIN",
440+ "PNPM_HOME", "PNPM_CONFIG_CHILD_CONCURRENCY", "PNPM_CONFIG_MODULES_DIR",
441+ "PNPM_CONFIG_NETWORK_CONCURRENCY", "PNPM_CONFIG_STORE_DIR",
442+ "PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN", "PNPM_CONFIG_VIRTUAL_STORE_DIR",
443+ "PNPM_CONFIG_SIDE_EFFECTS_CACHE", "PATH"
444+ )
445+ $envLines = foreach ($key in $keys) {
446+ $value = [Environment]::GetEnvironmentVariable($key)
447+ if ($value) {
448+ "$key=$value"
449+ }
450+ }
451+ $utf8NoBom = [System.Text.UTF8Encoding]::new($false)
452+ [System.IO.File]::WriteAllLines("$envFile.tmp", $envLines, $utf8NoBom)
453+ Move-Item -Force "$envFile.tmp" $envFile
454+ [System.IO.File]::WriteAllLines(
455+ "$servicesFile.tmp",
456+ @("# Docker containers visible from the hydrated runner", "docker not available on native Windows hydration"),
457+ $utf8NoBom
458+ )
459+ Move-Item -Force "$servicesFile.tmp" $servicesFile
460+ $stateLines = @(
461+ "WORKSPACE=$env:GITHUB_WORKSPACE",
462+ "RUN_ID=$env:GITHUB_RUN_ID",
463+ "JOB=$job",
464+ "ENV_FILE=$envFile",
465+ "SERVICES_FILE=$servicesFile",
466+ "READY_AT=$((Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"))"
467+ )
468+ [System.IO.File]::WriteAllLines("$state.tmp", $stateLines, $utf8NoBom)
469+ Move-Item -Force "$state.tmp" $state
470+471+ - name: Keep Crabbox job alive
472+shell: powershell
473+env:
474+CRABBOX_ID: ${{ inputs.crabbox_id }}
475+CRABBOX_KEEP_ALIVE_MINUTES: ${{ inputs.crabbox_keep_alive_minutes }}
476+run: |
477+ $ErrorActionPreference = "Stop"
478+ if (-not $env:CRABBOX_ID -or $env:CRABBOX_ID -notmatch '^[A-Za-z0-9._-]+$') {
479+ Write-Error "Invalid crabbox_id"
480+ }
481+ $minutes = 90
482+ if ($env:CRABBOX_KEEP_ALIVE_MINUTES -match '^[0-9]+$') {
483+ $minutes = [int]$env:CRABBOX_KEEP_ALIVE_MINUTES
484+ }
485+ $stop = Join-Path $HOME ".crabbox\actions\$env:CRABBOX_ID.stop"
486+ $deadline = (Get-Date).AddMinutes($minutes)
487+ while ((Get-Date) -lt $deadline) {
488+ if (Test-Path $stop) {
489+ exit 0
490+ }
491+ Start-Sleep -Seconds 15
492+ }
493+295494 hydrate-github:
296495name: hydrate-github
297496if: ${{ inputs.crabbox_job == 'hydrate-github' }}
@@ -445,7 +644,7 @@ jobs:
445644 fi
446645 }
447646 {
448- for key in CI GITHUB_ACTIONS GITHUB_WORKSPACE GITHUB_REPOSITORY GITHUB_RUN_ID GITHUB_RUN_NUMBER GITHUB_RUN_ATTEMPT GITHUB_REF GITHUB_REF_NAME GITHUB_SHA GITHUB_EVENT_NAME GITHUB_ACTOR RUNNER_OS RUNNER_ARCH RUNNER_TEMP RUNNER_TOOL_CACHE PNPM_CONFIG_CHILD_CONCURRENCY PNPM_CONFIG_MODULES_DIR PNPM_CONFIG_NETWORK_CONCURRENCY PNPM_CONFIG_STORE_DIR PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN PNPM_CONFIG_VIRTUAL_STORE_DIR; do
647+ for key in CI GITHUB_ACTIONS GITHUB_WORKSPACE GITHUB_REPOSITORY GITHUB_RUN_ID GITHUB_RUN_NUMBER GITHUB_RUN_ATTEMPT GITHUB_REF GITHUB_REF_NAME GITHUB_SHA GITHUB_EVENT_NAME GITHUB_ACTOR RUNNER_OS RUNNER_ARCH RUNNER_TEMP RUNNER_TOOL_CACHE NODE_BIN PNPM_HOME PNPM_CONFIG_CHILD_CONCURRENCY PNPM_CONFIG_MODULES_DIR PNPM_CONFIG_NETWORK_CONCURRENCY PNPM_CONFIG_STORE_DIR PNPM_CONFIG_VERIFY_DEPS_BEFORE_RUN PNPM_CONFIG_VIRTUAL_STORE_DIR PATH; do
449648 write_export "$key"
450649 done
451650 } > "${env_file}.tmp"
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。