[Refactor] Roll out stream helpers to LiteLLM and Z.ai specs #3262
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: E2E Tests (Mocked) | |
| on: | |
| workflow_dispatch: | |
| pull_request: | |
| types: [opened, reopened, ready_for_review, synchronize] | |
| merge_group: | |
| types: [checks_requested] | |
| permissions: | |
| contents: read | |
| jobs: | |
| e2e-mock: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 | |
| - name: Restore mocked E2E pass marker | |
| id: e2e-marker | |
| uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 | |
| with: | |
| path: .cache/e2e-pass | |
| # packages/** is intentionally broader than the old packages/core/** to avoid false cache hits when any package changes | |
| # base_ref is included to prevent same-repo branches from stuffing a pass marker for a different base | |
| key: ${{ runner.os }}-mocked-e2e-${{ github.base_ref }}-${{ hashFiles('src/**', 'webview-ui/**', 'apps/vscode-e2e/**', 'packages/**', 'package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml', 'turbo.json', '.github/workflows/e2e.yml', '.github/actions/setup-node-pnpm/**') }} | |
| - name: Use cached mocked E2E result | |
| if: github.event_name == 'pull_request' && steps.e2e-marker.outputs.cache-hit == 'true' | |
| run: echo "Skipping mocked E2E tests because this source hash already passed." | |
| - name: Setup Node.js and pnpm | |
| if: github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true' | |
| uses: ./.github/actions/setup-node-pnpm | |
| - name: Install xvfb | |
| if: github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true' | |
| run: sudo apt-get install -y xvfb | |
| - name: Get VS Code version from package.json | |
| if: github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true' | |
| id: vscode-ver | |
| run: | | |
| VERSION=$(node -p 'require("./apps/vscode-e2e/package.json").devDependencies["@types/vscode"]') | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| - name: Restore VS Code test binary cache | |
| if: github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true' | |
| id: vscode-cache | |
| uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 | |
| with: | |
| path: | | |
| apps/vscode-e2e/.vscode-test/ | |
| key: vscode-test-${{ runner.os }}-${{ steps.vscode-ver.outputs.version }}-v1 | |
| # Fall back to the most recent stale binary so a version bump or cache | |
| # eviction doesn't force a download when the VS Code CDN is unreachable. | |
| restore-keys: | | |
| vscode-test-${{ runner.os }}- | |
| - name: Probe VS Code download endpoints | |
| if: (github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true') && steps.vscode-cache.outputs.cache-hit != 'true' | |
| id: vscode-probe | |
| # The version-resolution API and the archive CDN are different hosts. The | |
| # archive URL 302-redirects to the CDN, so a HEAD probe that follows the | |
| # redirect covers both. The fallback engages when either is unreachable. | |
| run: | | |
| API_OK=false | |
| CDN_OK=false | |
| if curl -sf --max-time 10 https://update.code.visualstudio.com/api/releases/stable > /dev/null; then | |
| API_OK=true | |
| fi | |
| if curl -sfIL --max-time 20 -o /dev/null "https://update.code.visualstudio.com/${{ steps.vscode-ver.outputs.version }}/linux-x64/stable"; then | |
| CDN_OK=true | |
| fi | |
| if [ "$API_OK" = "true" ] && [ "$CDN_OK" = "true" ]; then | |
| echo "reachable=true" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "reachable=false" >> "$GITHUB_OUTPUT" | |
| echo "::warning::VS Code download endpoints unreachable (api=$API_OK, cdn=$CDN_OK); will try the stale cached binary" | |
| fi | |
| # @vscode/test-electron only skips its live version-resolution request when the | |
| # requested version already exists in .vscode-test/. On an exact-key miss it calls | |
| # the update API before its download retry loop, so an unreachable CDN fails the | |
| # job before any test runs. When the endpoints are down, point the runner at the | |
| # stale binary restored above (runTest.ts honors VSCODE_VERSION) so the suite | |
| # still runs. | |
| - name: Fall back to stale VS Code binary when CDN is unreachable | |
| if: (github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true') && steps.vscode-cache.outputs.cache-hit != 'true' && steps.vscode-probe.outputs.reachable == 'false' | |
| id: vscode-fallback | |
| run: | | |
| STALE=$(ls -d apps/vscode-e2e/.vscode-test/vscode-linux-x64-* 2>/dev/null | sort -V | tail -n 1 || true) | |
| if [ -n "$STALE" ]; then | |
| echo "VSCODE_VERSION=${STALE##*-}" >> "$GITHUB_ENV" | |
| echo "used=true" >> "$GITHUB_OUTPUT" | |
| echo "VS Code download endpoints are unreachable; falling back to cached VS Code ${STALE##*-}" | |
| else | |
| echo "::warning::VS Code download endpoints are unreachable and no cached binary is available; the download step will retry but may fail" | |
| fi | |
| # Retry only the binary download: version resolution and the archive fetch are | |
| # the network-fragile parts. Genuine test failures should fail fast, so the | |
| # test step itself is deliberately not retried. | |
| - name: Download VS Code test binary | |
| if: github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true' | |
| id: vscode-download | |
| run: | | |
| cd apps/vscode-e2e | |
| for attempt in 1 2 3; do | |
| if node -e "const { downloadAndUnzipVSCode } = require('@vscode/test-electron'); const version = process.env.VSCODE_VERSION || require('./package.json').devDependencies['@types/vscode']; downloadAndUnzipVSCode(version).catch((err) => { console.error(err); process.exit(1); });"; then | |
| exit 0 | |
| fi | |
| echo "VS Code download attempt ${attempt} failed" | |
| if [ "$attempt" -lt 3 ]; then | |
| sleep 15 | |
| fi | |
| done | |
| exit 1 | |
| # restore-keys can bring back older binaries alongside the one just | |
| # downloaded; keep only the effective version so each saved cache entry | |
| # stays at one binary instead of growing with every version bump. | |
| - name: Prune stale VS Code binaries | |
| if: github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true' | |
| run: | | |
| EFFECTIVE="${VSCODE_VERSION:-${{ steps.vscode-ver.outputs.version }}}" | |
| for dir in apps/vscode-e2e/.vscode-test/vscode-linux-x64-*; do | |
| [ -e "$dir" ] || continue | |
| if [ "$(basename "$dir")" != "vscode-linux-x64-$EFFECTIVE" ]; then | |
| echo "Pruning stale VS Code binary $(basename "$dir")" | |
| rm -rf "$dir" | |
| fi | |
| done | |
| # Skip the save when the stale-binary fallback ran: the pinned-version key | |
| # must not be populated with an older binary. | |
| - name: Save VS Code test binary cache | |
| if: (github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true') && steps.vscode-cache.outputs.cache-hit != 'true' && steps.vscode-fallback.outputs.used != 'true' | |
| continue-on-error: true | |
| uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 | |
| with: | |
| path: | | |
| apps/vscode-e2e/.vscode-test/ | |
| key: vscode-test-${{ runner.os }}-${{ steps.vscode-ver.outputs.version }}-v1 | |
| - name: Run mocked E2E tests | |
| id: run-e2e | |
| # merge_group and workflow_dispatch always run; cache skip is pull_request only | |
| if: github.event_name != 'pull_request' || steps.e2e-marker.outputs.cache-hit != 'true' | |
| run: xvfb-run -a pnpm --filter @roo-code/vscode-e2e test:ci:mock | |
| - name: Explain skipped mocked E2E pass marker | |
| if: steps.e2e-marker.outputs.cache-hit != 'true' && steps.run-e2e.outcome == 'success' && steps.vscode-fallback.outputs.used == 'true' | |
| run: echo "Skipping mocked E2E pass marker because tests ran against a stale cached VS Code binary (VS Code download endpoints unreachable)." | |
| - name: Write mocked E2E pass marker | |
| # Skip when the stale-binary fallback ran: a pass against an older VS Code | |
| # must not mint a marker for the intended-version source hash. | |
| if: steps.e2e-marker.outputs.cache-hit != 'true' && steps.run-e2e.outcome == 'success' && steps.vscode-fallback.outputs.used != 'true' | |
| run: mkdir -p .cache/e2e-pass && date -u > .cache/e2e-pass/passed | |
| - name: Save mocked E2E pass marker | |
| if: steps.e2e-marker.outputs.cache-hit != 'true' && steps.run-e2e.outcome == 'success' && steps.vscode-fallback.outputs.used != 'true' | |
| continue-on-error: true | |
| uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 | |
| with: | |
| path: .cache/e2e-pass | |
| key: ${{ steps.e2e-marker.outputs.cache-primary-key }} |