Skip to content

ci(e2e): unify Linux + Windows UI tests into one parallel workflow #1

ci(e2e): unify Linux + Windows UI tests into one parallel workflow

ci(e2e): unify Linux + Windows UI tests into one parallel workflow #1

Workflow file for this run

name: E2E UI Tests
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
# Unified parallel E2E UI pipeline for Linux + Windows.
#
# discover-plans → emits a matrix of test-plan basenames
# build-linux / build-windows → produce VSIX once per OS, upload artifact
# e2e-linux / e2e-windows (matrix)→ one job per (OS, plan), running in parallel
# analyze → aggregates results from BOTH OSes into a
# single unified summary in $GITHUB_STEP_SUMMARY
# Linux-UI / Windows-UI (gate) → preserves the original required-status-check
# names so existing branch-protection keeps working
#
# Modelled after vscode-java-pack/.github/workflows/e2e-autotest.yml,
# but consolidates the two former workflows (linuxUI.yml, windowsUI.yml)
# into one file with one shared summary.
jobs:
# ── Discover test plans ─────────────────────────────────
discover-plans:
name: Discover E2E Plans
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.scan.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- name: Scan test plans
id: scan
shell: bash
run: |
plans=$(ls test/e2e-plans/*.yaml | xargs -n1 basename | sed 's/\.yaml$//' | jq -R . | jq -sc .)
echo "matrix=$plans" >> "$GITHUB_OUTPUT"
echo "Found plans: $plans"
# ── Build VSIX (Linux) ──────────────────────────────────
build-linux:
name: Build VSIX (Linux)
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install Node.js modules
run: npm install
- name: Install VSCE
run: npm install -g @vscode/vsce
- name: Build OSGi bundle
run: npm run build-server
- name: Build VSIX file
run: vsce package -o vscode-java-dependency.vsix
- name: Upload VSIX artifact
uses: actions/upload-artifact@v4
with:
name: vsix-linux
path: vscode-java-dependency.vsix
retention-days: 1
# ── Build VSIX (Windows) — also runs lint + checkstyle ──
build-windows:
name: Build VSIX (Windows)
runs-on: windows-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install Node.js modules
run: npm install
- name: Install VSCE
run: npm install -g @vscode/vsce
- name: Lint
run: npm run tslint
- name: Checkstyle
working-directory: .\jdtls.ext
run: .\mvnw.cmd checkstyle:check
- name: Build OSGi bundle
run: npm run build-server
- name: Build VSIX file
run: vsce package -o vscode-java-dependency.vsix
- name: Upload VSIX artifact
uses: actions/upload-artifact@v4
with:
name: vsix-windows
path: vscode-java-dependency.vsix
retention-days: 1
# ── Run each plan in parallel (Linux) ───────────────────
e2e-linux:
name: Linux (${{ matrix.plan }})
needs: [ build-linux, discover-plans ]
runs-on: ubuntu-latest
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
plan: ${{ fromJson(needs.discover-plans.outputs.matrix) }}
steps:
- uses: actions/checkout@v4
- name: Setup Build Environment
run: |
sudo apt-get update
sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 dbus xvfb libgtk-3-0 libgbm1
# Use 1920x1080 so the Java Projects view (rendered inside the Explorer
# sidebar) gets enough vertical space. With 1024x768 the sticky
# pane-header overlapped tree rows and intercepted click events.
sudo /usr/bin/Xvfb :99 -screen 0 1920x1080x24 > /dev/null 2>&1 &
sleep 3
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup autotest
run: npm install -g @vscjava/vscode-autotest
- name: Download VSIX artifact
uses: actions/download-artifact@v4
with:
name: vsix-linux
path: .
- name: E2E Test — ${{ matrix.plan }}
env:
AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }}
AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }}
run: |
DISPLAY=:99 autotest run "test/e2e-plans/${{ matrix.plan }}.yaml" \
--vsix "$(pwd)/vscode-java-dependency.vsix" \
--output "test-results/${{ matrix.plan }}"
- name: Upload test results
if: ${{ always() }}
uses: actions/upload-artifact@v4
with:
name: e2e-results-linux-${{ matrix.plan }}
path: test-results/
retention-days: 7
# ── Run each plan in parallel (Windows) ─────────────────
e2e-windows:
name: Windows (${{ matrix.plan }})
needs: [ build-windows, discover-plans ]
runs-on: windows-latest
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
plan: ${{ fromJson(needs.discover-plans.outputs.matrix) }}
steps:
- uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup autotest
run: npm install -g @vscjava/vscode-autotest
- name: Download VSIX artifact
uses: actions/download-artifact@v4
with:
name: vsix-windows
path: .
- name: E2E Test — ${{ matrix.plan }}
env:
AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }}
AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }}
run: |
autotest run "test/e2e-plans/${{ matrix.plan }}.yaml" --vsix "$((Get-Location).Path)\vscode-java-dependency.vsix" --output "test-results\${{ matrix.plan }}"
- name: Upload test results
if: ${{ always() }}
uses: actions/upload-artifact@v4
with:
name: e2e-results-windows-${{ matrix.plan }}
path: test-results/
retention-days: 7
# ── Unified analysis across both OSes ───────────────────
analyze:
name: E2E Summary
needs: [ e2e-linux, e2e-windows ]
if: ${{ always() }}
runs-on: ubuntu-latest
steps:
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup autotest
run: npm install -g @vscjava/vscode-autotest
- name: Download all plan results
uses: actions/download-artifact@v4
with:
pattern: e2e-results-*
path: all-results
merge-multiple: false
- name: Organize results (prefix each plan by OS)
shell: bash
run: |
mkdir -p test-results
for dir in all-results/e2e-results-linux-*/; do
find "$dir" -name "results.json" -exec dirname {} \; | while read d; do
name=$(basename "$d")
mkdir -p "test-results/linux-$name"
cp -r "$d"/. "test-results/linux-$name"/
done
done
for dir in all-results/e2e-results-windows-*/; do
find "$dir" -name "results.json" -exec dirname {} \; | while read d; do
name=$(basename "$d")
mkdir -p "test-results/windows-$name"
cp -r "$d"/. "test-results/windows-$name"/
done
done
echo "Organized plan result directories:"
ls test-results/ || true
- name: Analyze results
env:
AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }}
AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
AZURE_OPENAI_DEPLOYMENT: ${{ secrets.AZURE_OPENAI_DEPLOYMENT }}
run: autotest analyze test-results --output test-results
- name: Write Job Summary
if: always()
shell: bash
run: |
if [ -f test-results/summary.md ]; then
cat test-results/summary.md >> "$GITHUB_STEP_SUMMARY"
fi
- name: Upload aggregate summary
if: always()
uses: actions/upload-artifact@v4
with:
name: e2e-aggregate-summary
path: test-results/summary.md
retention-days: 30
# ── Branch-protection compatibility gates ───────────────
# Preserve the original required-status-check names so existing
# branch-protection rules keep working without edits. Each gate
# checks only its own OS's pipeline (analyze is shared and excluded
# so a per-OS gate can pass/fail independently).
Linux-UI:
name: Linux-UI
needs: [ build-linux, discover-plans, e2e-linux ]
if: ${{ always() }}
runs-on: ubuntu-latest
steps:
- name: Verify Linux jobs
shell: bash
run: |
echo "build-linux: ${{ needs.build-linux.result }}"
echo "discover-plans: ${{ needs.discover-plans.result }}"
echo "e2e-linux: ${{ needs.e2e-linux.result }}"
if [ "${{ needs.build-linux.result }}" != "success" ] || \
[ "${{ needs.discover-plans.result }}" != "success" ] || \
[ "${{ needs.e2e-linux.result }}" != "success" ]; then
echo "::error::One or more Linux-UI jobs failed"
exit 1
fi
Windows-UI:
name: Windows-UI
needs: [ build-windows, discover-plans, e2e-windows ]
if: ${{ always() }}
runs-on: ubuntu-latest
steps:
- name: Verify Windows jobs
shell: bash
run: |
echo "build-windows: ${{ needs.build-windows.result }}"
echo "discover-plans: ${{ needs.discover-plans.result }}"
echo "e2e-windows: ${{ needs.e2e-windows.result }}"
if [ "${{ needs.build-windows.result }}" != "success" ] || \
[ "${{ needs.discover-plans.result }}" != "success" ] || \
[ "${{ needs.e2e-windows.result }}" != "success" ]; then
echo "::error::One or more Windows-UI jobs failed"
exit 1
fi