Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
180 changes: 163 additions & 17 deletions .github/workflows/e2e-scenarios.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -149,31 +149,177 @@ jobs:
"WSL_CHECKOUT_DIR=$wslCheckoutPath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"WSL_WORKDIR=$wslWorkdir" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: Ensure Ubuntu WSL exists
if: contains(inputs.scenarios || github.event.inputs.scenarios, 'wsl-repo-cloud-openclaw')
shell: powershell
run: |
wsl --list --verbose 2>&1 | Out-Default
$null = wsl -d $env:WSL_DISTRO -- echo ok 2>&1
if ($LASTEXITCODE -ne 0) {
$maxAttempts = 3
$installed = $false
for ($attempt = 1; $attempt -le $maxAttempts; $attempt++) {
Write-Host "Ubuntu not found - installing via wsl --install (attempt $attempt/$maxAttempts)"
wsl --install -d $env:WSL_DISTRO --no-launch --web-download
$installExitCode = $LASTEXITCODE
if ($installExitCode -eq 0) {
wsl -d $env:WSL_DISTRO -- bash -c 'echo distro initialised'
$launchExitCode = $LASTEXITCODE
if ($launchExitCode -eq 0) {
$installed = $true
break
}
Write-Warning "distro first-launch failed with exit code $launchExitCode"
} else {
Write-Warning "wsl --install failed with exit code $installExitCode"
}

$null = wsl -d $env:WSL_DISTRO -- echo ok 2>&1
if ($LASTEXITCODE -eq 0) {
Write-Host 'Ubuntu became available after the install command returned non-zero'
$installed = $true
break
}

if ($attempt -lt $maxAttempts) {
Write-Host 'Cleaning up any partial WSL registration before retrying'
$null = wsl --unregister $env:WSL_DISTRO 2>&1
$delaySeconds = [Math]::Min(60, 20 * $attempt)
Write-Host "Retrying WSL install in $delaySeconds seconds..."
Start-Sleep -Seconds $delaySeconds
}
}

if (-not $installed) {
throw ("failed to install and initialize $env:WSL_DISTRO after $maxAttempts attempts")
}
} else {
Write-Host 'Ubuntu already available'
}
wsl --set-default $env:WSL_DISTRO
if ($LASTEXITCODE -ne 0) {
throw ('wsl --set-default failed with exit code ' + $LASTEXITCODE)
}

- name: Verify WSL
if: contains(inputs.scenarios || github.event.inputs.scenarios, 'wsl-repo-cloud-openclaw')
shell: powershell
run: |
wsl -d $env:WSL_DISTRO -- bash -lc "uname -a"
wsl -d $env:WSL_DISTRO -- bash -lc "cat /etc/os-release"

- name: Install Ubuntu dependencies
if: contains(inputs.scenarios || github.event.inputs.scenarios, 'wsl-repo-cloud-openclaw')
shell: powershell
run: |
$script = @'
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
printf '%s\n' \
'Acquire::ForceIPv4 "true";' \
'Acquire::Retries "5";' \
>/etc/apt/apt.conf.d/99github-actions-network
apt-get update
apt-get install -y bash ca-certificates curl git jq lsb-release make python3 python3-pip rsync tar unzip xz-utils
'@
$tmp = "$env:RUNNER_TEMP\wsl-step.sh"
[IO.File]::WriteAllText($tmp, ($script -replace "`r",""), (New-Object System.Text.UTF8Encoding $false))
$wslTmp = wsl -d $env:WSL_DISTRO -- wslpath -u ($tmp -replace '\\','/')
wsl -d $env:WSL_DISTRO -- bash -l $wslTmp

- name: Install Node.js 22 in WSL
if: contains(inputs.scenarios || github.event.inputs.scenarios, 'wsl-repo-cloud-openclaw')
shell: powershell
run: |
$script = @'
set -euo pipefail
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt-get install -y nodejs
node --version
npm --version
'@
$tmp = "$env:RUNNER_TEMP\wsl-step.sh"
[IO.File]::WriteAllText($tmp, ($script -replace "`r",""), (New-Object System.Text.UTF8Encoding $false))
$wslTmp = wsl -d $env:WSL_DISTRO -- wslpath -u ($tmp -replace '\\','/')
wsl -d $env:WSL_DISTRO -- bash -l $wslTmp

- name: Copy checkout into WSL ext4 workspace
if: contains(inputs.scenarios || github.event.inputs.scenarios, 'wsl-repo-cloud-openclaw')
shell: powershell
run: |
$checkout = $env:WSL_CHECKOUT_DIR
$workdir = $env:WSL_WORKDIR
$workdirParent = $workdir.Substring(0, $workdir.LastIndexOf('/'))
$script = @"
set -euo pipefail
echo 'Syncing checkout from $checkout to $workdir'
if [ ! -d '$checkout/.git' ]; then
echo 'Expected a Git checkout at $checkout' >&2
exit 1
fi
rm -rf '$workdir'
mkdir -p '$workdirParent'
rsync -a --no-owner --no-group --delete \
--exclude '/node_modules/' \
--exclude '/nemoclaw/node_modules/' \
--exclude '/nemoclaw-blueprint/.venv/' \
'$checkout'/ '$workdir'/
git config --global --add safe.directory '$workdir'
git -C '$workdir' reset --hard HEAD
git -C '$workdir' clean -ffdx
git -C '$workdir' status --short
echo 'WSL ext4 workspace ready at $workdir'
"@
$tmp = "$env:RUNNER_TEMP\wsl-step.sh"
[IO.File]::WriteAllText($tmp, ($script -replace "`r",""), (New-Object System.Text.UTF8Encoding $false))
$wslTmp = wsl -d $env:WSL_DISTRO -- wslpath -u ($tmp -replace '\\','/')
wsl -d $env:WSL_DISTRO -- bash -l $wslTmp

- name: Run typed scenarios in WSL
if: contains(inputs.scenarios || github.event.inputs.scenarios, 'wsl-repo-cloud-openclaw')
shell: bash
shell: powershell
env:
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
SCENARIOS: ${{ inputs.scenarios || github.event.inputs.scenarios }}
run: |
set -euo pipefail
if [[ ! "${SCENARIOS}" =~ ^[A-Za-z0-9._-]+(,[A-Za-z0-9._-]+)*$ ]]; then
echo "::error::Invalid scenario input: ${SCENARIOS}" >&2
if ($env:SCENARIOS -notmatch '^[A-Za-z0-9._-]+(,[A-Za-z0-9._-]+)*$') {
Write-Error "Invalid scenario input: $env:SCENARIOS"
exit 1
}
$workdir = $env:WSL_WORKDIR
$checkout = $env:WSL_CHECKOUT_DIR
$scenarios = $env:SCENARIOS
$script = @"
set -euo pipefail
workdir='$workdir'
checkout_dir='$checkout'
scenarios='$scenarios'
mkdir -p "`$workdir"
cd "`$workdir"
export E2E_CONTEXT_DIR="`$workdir"
npm ci --ignore-scripts
set +e
npx tsx test/e2e-scenario/scenarios/run.ts --scenarios "`$scenarios" --dry-run
status=`$?
if [ -d "`$workdir/.e2e" ]; then
rm -rf "`$checkout_dir/.e2e"
cp -a "`$workdir/.e2e" "`$checkout_dir/.e2e"
fi
if [ -d "`$workdir/test/e2e/logs" ]; then
mkdir -p "`$checkout_dir/test/e2e"
rm -rf "`$checkout_dir/test/e2e/logs"
cp -a "`$workdir/test/e2e/logs" "`$checkout_dir/test/e2e/logs"
fi
wsl -d "${WSL_DISTRO}" -- env \
NVIDIA_API_KEY="${NVIDIA_API_KEY}" \
SCENARIOS="${SCENARIOS}" \
WSL_CHECKOUT_DIR="${WSL_CHECKOUT_DIR}" \
WSL_WORKDIR="${WSL_WORKDIR}" \
bash -lc '
set -euo pipefail
cd "${WSL_CHECKOUT_DIR}"
mkdir -p "${WSL_WORKDIR}"
export E2E_CONTEXT_DIR="${WSL_WORKDIR}"
npm ci --ignore-scripts
npx tsx test/e2e-scenario/scenarios/run.ts --scenarios "${SCENARIOS}" --dry-run
'
exit "`$status"
"@
$tmp = "$env:RUNNER_TEMP\wsl-step.sh"
[IO.File]::WriteAllText($tmp, ($script -replace "`r",""), (New-Object System.Text.UTF8Encoding $false))
$wslTmp = wsl -d $env:WSL_DISTRO -- wslpath -u ($tmp -replace '\\','/')
$apiKeyArg = "NVIDIA_API_KEY=$env:NVIDIA_API_KEY"
wsl -d $env:WSL_DISTRO -- env $apiKeyArg bash -l $wslTmp
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}

- name: Append plan summary
if: always()
Expand Down
Loading
Loading