Skip to content

Commit 7795980

Browse files
authored
Merge branch 'main' into fix/2541-build-context-help
2 parents c82c415 + 502d725 commit 7795980

6 files changed

Lines changed: 691 additions & 16 deletions

File tree

.github/workflows/e2e-brev.yaml renamed to .github/workflows/e2e-branch-validation.yaml

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,30 @@
11
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
22
# SPDX-License-Identifier: Apache-2.0
33

4-
name: e2e-brev
4+
name: e2e-branch-validation
55

6-
# Ephemeral Brev E2E: provisions a cloud instance, bootstraps NemoClaw,
7-
# runs test suites remotely, then tears down. Use workflow_dispatch to
8-
# trigger manually from the Actions tab, or workflow_call from other workflows.
6+
# ─── Branch Validation E2E ───────────────────────────────────────────────────
7+
#
8+
# PURPOSE: Validates a specific git branch by installing NemoClaw FROM SOURCE
9+
# on an ephemeral Brev cloud instance. Answers the question: "Does this branch
10+
# work if you install from source on a clean machine?"
11+
#
12+
# HOW IT WORKS:
13+
# 1. Provisions a fresh Brev CPU instance (~4 vCPU, 16 GB RAM)
14+
# 2. Rsyncs the checked-out branch code to the VM
15+
# 3. Runs install.sh from source + onboards a sandbox
16+
# 4. Executes the selected test suite against the live sandbox
17+
# 5. Tears down the instance (unless keep_alive=true)
18+
#
19+
# WHEN TO USE:
20+
# - Before merging a PR that touches onboard, sandbox, security, or infra
21+
# - To validate a branch works end-to-end on a clean Linux environment
22+
# - To run security regression suites (credential-sanitization, injection)
23+
# - Manually via workflow_dispatch, or called from other workflows
24+
#
25+
# NOTE: This does NOT test the community install path (launch-plugin.sh).
26+
# For validating what Brev Launchable users actually get, see the
27+
# e2e-launchable-smoke job in nightly-e2e.yaml.
928
#
1029
# Test suites:
1130
# full — Install → onboard → sandbox verify → live inference
@@ -98,11 +117,11 @@ permissions:
98117
pull-requests: write
99118

100119
concurrency:
101-
group: e2e-brev-${{ inputs.pr_number || github.run_id }}
120+
group: e2e-branch-validation-${{ inputs.pr_number || github.run_id }}
102121
cancel-in-progress: true
103122

104123
jobs:
105-
e2e-brev:
124+
e2e-branch-validation:
106125
# if: github.repository == 'NVIDIA/NemoClaw' # Disabled for fork testing — re-enable before merge
107126
runs-on: ubuntu-latest
108127
timeout-minutes: 90
@@ -182,7 +201,7 @@ jobs:
182201
LAUNCHABLE_SETUP_SCRIPT: ${{ inputs.setup_script_url || '' }}
183202
BREV_PROVIDER: gcp
184203
KEEP_ALIVE: ${{ inputs.keep_alive }}
185-
run: npx vitest run --project e2e-brev --reporter=verbose
204+
run: npx vitest run --project e2e-branch-validation --reporter=verbose
186205

187206
- name: Update check run (completed)
188207
if: always() && inputs.pr_number != '' && env.CHECK_RUN_ID != ''
@@ -260,6 +279,6 @@ jobs:
260279
if: failure()
261280
uses: actions/upload-artifact@v4
262281
with:
263-
name: e2e-brev-logs
282+
name: e2e-branch-validation-logs
264283
path: /tmp/brev-e2e-*.log
265284
if-no-files-found: ignore

.github/workflows/nightly-e2e.yaml

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
# credential-migration-e2e Validates legacy ~/.nemoclaw/credentials.json migration to the
1919
# OpenShell gateway, secure zero-fill on unlink, allowlist filter
2020
# on non-credential env keys, and symlink-safe deletion.
21+
# launchable-smoke-e2e Community install path (brev-launchable-ci-cpu.sh) on ubuntu-latest.
2122
# gpu-e2e Local Ollama inference on an NVKS ephemeral GPU runner.
2223
# gpu-double-onboard-e2e Ollama proxy token consistency after re-onboard (#2553).
2324
# notify-on-failure Auto-creates a GitHub issue when any E2E job fails.
@@ -53,7 +54,7 @@ on:
5354
upgrade-stale-sandbox-e2e, rebuild-hermes-e2e, double-onboard-e2e,
5455
onboard-repair-e2e, onboard-resume-e2e, runtime-overrides-e2e,
5556
credential-sanitization-e2e, telegram-injection-e2e,
56-
overlayfs-autofix-e2e, gpu-e2e, gpu-double-onboard-e2e
57+
overlayfs-autofix-e2e, launchable-smoke-e2e, gpu-e2e, gpu-double-onboard-e2e
5758
required: false
5859
type: string
5960
default: ""
@@ -1278,6 +1279,59 @@ jobs:
12781279
/tmp/nemoclaw-e2e-onboard-negative.log
12791280
if-no-files-found: ignore
12801281

1282+
# ── Launchable Install-Flow Smoke Test ─────────────────────────
1283+
# Validates the community install path (brev-launchable-ci-cpu.sh) end-to-end.
1284+
# The launchable script has ZERO Brev dependencies — it's a generic Ubuntu
1285+
# bootstrap script that runs on ubuntu-latest. Catches regressions like the
1286+
# Apr 20-25 Brev outage (#2472, #2482) and container reachability fallback (#2425).
1287+
# See: issue #2599
1288+
launchable-smoke-e2e:
1289+
if: >-
1290+
github.repository == 'NVIDIA/NemoClaw' &&
1291+
(github.event_name != 'workflow_dispatch' ||
1292+
inputs.jobs == '' ||
1293+
contains(format(',{0},', inputs.jobs), ',launchable-smoke-e2e,'))
1294+
runs-on: ubuntu-latest
1295+
timeout-minutes: 30
1296+
steps:
1297+
- name: Checkout
1298+
uses: actions/checkout@v6
1299+
1300+
- name: Run launchable install-flow smoke test
1301+
env:
1302+
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
1303+
NEMOCLAW_NON_INTERACTIVE: "1"
1304+
NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE: "1"
1305+
NEMOCLAW_SANDBOX_NAME: "e2e-launchable"
1306+
NEMOCLAW_RECREATE_SANDBOX: "1"
1307+
SKIP_DOCKER_PULL: "1"
1308+
GITHUB_TOKEN: ${{ github.token }}
1309+
run: bash test/e2e/test-launchable-smoke.sh
1310+
1311+
- name: Upload install log on failure
1312+
if: failure()
1313+
uses: actions/upload-artifact@v4
1314+
with:
1315+
name: launchable-smoke-install-log
1316+
path: /tmp/nemoclaw-launchable-install.log
1317+
if-no-files-found: ignore
1318+
1319+
- name: Upload onboard log on failure
1320+
if: failure()
1321+
uses: actions/upload-artifact@v4
1322+
with:
1323+
name: launchable-smoke-onboard-log
1324+
path: /tmp/nemoclaw-launchable-onboard.log
1325+
if-no-files-found: ignore
1326+
1327+
- name: Upload test log on failure
1328+
if: failure()
1329+
uses: actions/upload-artifact@v4
1330+
with:
1331+
name: launchable-smoke-test-log
1332+
path: /tmp/nemoclaw-launchable-test.log
1333+
if-no-files-found: ignore
1334+
12811335
# ── GPU E2E (Ollama local inference) ──────────────────────────
12821336
# Runs on an NVKS ephemeral GPU runner (RTX Pro 6000, 36 GB VRAM).
12831337
# Each job gets a fresh VM — no state leakage between runs.
@@ -1423,6 +1477,7 @@ jobs:
14231477
credential-sanitization-e2e,
14241478
telegram-injection-e2e,
14251479
overlayfs-autofix-e2e,
1480+
launchable-smoke-e2e,
14261481
gpu-e2e,
14271482
gpu-double-onboard-e2e,
14281483
]

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ Tests are organized into three Vitest projects defined in `vitest.config.ts`:
5959

6060
1. **`cli`**`test/**/*.test.{js,ts}` — integration tests for CLI behavior
6161
2. **`plugin`**`nemoclaw/src/**/*.test.ts` — unit tests co-located with source
62-
3. **`e2e-brev`**`test/e2e/brev-e2e.test.js`cloud E2E (requires `BREV_API_TOKEN`)
62+
3. **`e2e-branch-validation`**`test/e2e/brev-e2e.test.ts`validates a branch from source on ephemeral Brev instance (requires `BREV_API_TOKEN`)
6363

6464
When writing tests:
6565

test/e2e/brev-e2e.test.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
/**
5-
* Ephemeral Brev E2E test suite.
5+
* Branch Validation E2E — installs NemoClaw FROM SOURCE on a fresh Brev instance.
66
*
7-
* Creates a fresh Brev instance via the launchable bootstrap path, bootstraps it,
8-
* runs E2E tests remotely, then tears it down.
7+
* Answers: "Does this branch work if you install from source on a clean machine?"
8+
*
9+
* Creates a fresh Brev instance, rsyncs the checked-out branch code, runs
10+
* install.sh from source, onboards a sandbox, then executes the selected test
11+
* suite against the live environment. Tears down the instance when done.
12+
*
13+
* NOTE: This does NOT test the community Launchable install path
14+
* (launch-plugin.sh). For that, see test-launchable-smoke.sh wired into
15+
* nightly-e2e.yaml.
916
*
1017
* Intended to be run from CI via:
11-
* npx vitest run --project e2e-brev
18+
* npx vitest run --project e2e-branch-validation
1219
*
1320
* Required env vars:
1421
* NVIDIA_API_KEY — passed to VM for inference config during onboarding

0 commit comments

Comments
 (0)