Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
4c2498b
feat(ci): add nightly onboard trace timing summaries
amata-human Jun 11, 2026
dd7e42f
fix(ci): sanitize trace artifacts by default
amata-human Jun 11, 2026
ca50c86
Merge remote-tracking branch 'origin/main' into 5090-perfonboard-enab…
amata-human Jun 11, 2026
c579e6c
fix(ci): secure trace artifact temp files
amata-human Jun 11, 2026
2e3c251
fix(ci): remove legacy nightly trend lookup
amata-human Jun 11, 2026
bd561ef
Merge branch 'main' into 5090-perfonboard-enable-nemoclaw-e2e-trace-t…
amata-human Jun 11, 2026
b6df58f
fix(ci): report partial selective cancellations
amata-human Jun 11, 2026
40f615e
Merge branch 'main' into 5090-perfonboard-enable-nemoclaw-e2e-trace-t…
amata-human Jun 11, 2026
4f8fb36
Merge branch 'main' into 5090-perfonboard-enable-nemoclaw-e2e-trace-t…
amata-human Jun 11, 2026
34a534c
Merge branch 'main' into 5090-perfonboard-enable-nemoclaw-e2e-trace-t…
amata-human Jun 11, 2026
b3ead4a
Merge branch 'main' into 5090-perfonboard-enable-nemoclaw-e2e-trace-t…
amata-human Jun 11, 2026
6165a0f
fix(ci): upload trusted trace summary
jyaunches Jun 12, 2026
a49be05
Merge branch 'main' into 5090-perfonboard-enable-nemoclaw-e2e-trace-t…
amata-human Jun 12, 2026
1ac80d7
Merge branch 'main' into 5090-perfonboard-enable-nemoclaw-e2e-trace-t…
amata-human Jun 12, 2026
dabf716
Merge branch 'main' into 5090-perfonboard-enable-nemoclaw-e2e-trace-t…
amata-human Jun 12, 2026
8e7e3dd
fix(ci): fail closed on trace artifact sanitization
amata-human Jun 12, 2026
77c03dc
fix(ci): harden trace timing artifacts
amata-human Jun 12, 2026
de901ea
fix(ci): tighten trace summary trust boundary
amata-human Jun 12, 2026
52aed7c
fix(ci): reap e2e script process group
amata-human Jun 12, 2026
0e7cf66
Potential fix for pull request finding 'CodeQL / Unused variable, imp…
cv Jun 12, 2026
361984e
Merge branch 'main' into 5090-perfonboard-enable-nemoclaw-e2e-trace-t…
cv Jun 12, 2026
4e2d83f
merge(main): sync trace timing PR
cv Jun 13, 2026
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
18 changes: 17 additions & 1 deletion .github/actions/run-e2e-script/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ name: Run E2E script

description: >-
Runs a repository E2E script from an already-checked-out workspace and uploads
the configured artifacts when the script fails.
configured failure artifacts plus optional always-on artifacts.

inputs:
script:
Expand All @@ -21,6 +21,14 @@ inputs:
artifact-path:
description: Newline-capable artifact path glob list.
required: true
always-artifact-name:
description: Optional artifact name to upload after every script run.
required: false
default: ""
always-artifact-path:
description: Optional newline-capable artifact path glob list to upload after every script run.
required: false
default: ""

runs:
using: composite
Expand Down Expand Up @@ -62,3 +70,11 @@ runs:
name: ${{ inputs.artifact-name }}
path: ${{ inputs.artifact-path }}
if-no-files-found: ignore

- name: Upload E2E artifacts
if: always() && inputs.always-artifact-name != '' && inputs.always-artifact-path != ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: ${{ inputs.always-artifact-name }}
path: ${{ inputs.always-artifact-path }}
if-no-files-found: warn
15 changes: 14 additions & 1 deletion .github/workflows/e2e-script.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@ on:
description: Newline-capable failure artifact path glob list.
required: true
type: string
always_artifact_name:
description: Optional artifact name to upload after every script run.
required: false
type: string
default: ""
always_artifact_path:
description: Optional newline-capable artifact path glob list to upload after every script run.
required: false
type: string
default: ""
env_json:
description: JSON object of non-secret environment variables for the script.
required: false
Expand Down Expand Up @@ -127,7 +137,8 @@ jobs:
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
ref: ${{ github.ref }}
sparse-checkout: .github/actions/run-e2e-script
sparse-checkout: |
.github/actions/run-e2e-script
path: workflow-actions
persist-credentials: false

Expand Down Expand Up @@ -203,6 +214,8 @@ jobs:
script: ${{ inputs.script }}
artifact-name: ${{ inputs.artifact_name }}
artifact-path: ${{ inputs.artifact_path }}
always-artifact-name: ${{ inputs.always_artifact_name }}
always-artifact-path: ${{ inputs.always_artifact_path }}
env:
BRAVE_API_KEY: ${{ inputs.brave_api_key && secrets.BRAVE_API_KEY || '' }}
GITHUB_TOKEN: ${{ inputs.github_token && github.token || '' }}
Expand Down
19 changes: 17 additions & 2 deletions .github/workflows/nightly-e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,9 @@ jobs:
script: test/e2e/test-cloud-onboard-e2e.sh
artifact_name: "install-log-cloud-onboard"
artifact_path: "/tmp/nemoclaw-e2e-cloud-onboard-install.log"
env_json: '{"NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE":"1","NEMOCLAW_NON_INTERACTIVE":"1","NEMOCLAW_POLICY_MODE":"custom","NEMOCLAW_POLICY_PRESETS":"npm,pypi","NEMOCLAW_RECREATE_SANDBOX":"1","NEMOCLAW_SANDBOX_NAME":"e2e-cloud-onboard"}'
always_artifact_name: "cloud-onboard-traces"
always_artifact_path: "/tmp/nemoclaw-traces/"
env_json: '{"NEMOCLAW_ACCEPT_THIRD_PARTY_SOFTWARE":"1","NEMOCLAW_NON_INTERACTIVE":"1","NEMOCLAW_POLICY_MODE":"custom","NEMOCLAW_POLICY_PRESETS":"npm,pypi","NEMOCLAW_RECREATE_SANDBOX":"1","NEMOCLAW_SANDBOX_NAME":"e2e-cloud-onboard","NEMOCLAW_TRACE_DIR":"/tmp/nemoclaw-traces"}'
checked_out_ref_env: "NEMOCLAW_PUBLIC_INSTALL_REF"
nvidia_api_key: true
github_token: true
Expand Down Expand Up @@ -2627,6 +2629,14 @@ jobs:
const EXCLUDED_JOBS = new Set(['gpu-e2e', 'notify-on-failure', 'report-to-pr', 'scorecard']);

// ── Helpers ─────────────────────────────────────────────
const path = require('path');
const traceTiming = require(path.join(
process.env.GITHUB_WORKSPACE,
'scripts/scorecard/analyze-trace-timing.ts',
));

const WORKFLOW_FILE = 'nightly-e2e.yaml';

function formatDate(date) {
return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });
}
Expand Down Expand Up @@ -2739,7 +2749,6 @@ jobs:
trendLine = 'Trend: ⊘ Not shown for selective dispatches';
} else {
try {
const WORKFLOW_FILE = 'nightly-e2e.yaml';
const now = new Date();
const since48h = new Date(now.getTime() - 48 * 60 * 60 * 1000).toISOString();
const since24h = new Date(now.getTime() - 24 * 60 * 60 * 1000).toISOString();
Expand Down Expand Up @@ -2787,6 +2796,9 @@ jobs:
}
}

const { traceTimingLine, traceSummaryLines } =
await traceTiming.buildTraceTimingResult({ github, context });

// ── Build scorecard ─────────────────────────────────────
const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`;
const lines = [
Expand Down Expand Up @@ -2822,6 +2834,8 @@ jobs:

lines.push('');
lines.push(trendLine);
lines.push(traceTimingLine);
lines.push(...traceSummaryLines);
lines.push('');
lines.push(`🔗 [Full run details](${runUrl})`);

Expand All @@ -2848,6 +2862,7 @@ jobs:
perfect,
failedJobs,
trendLine,
traceTimingLine,
runUrl,
}));

Expand Down
Loading
Loading