ci(e2e): unify Linux + Windows UI tests into one parallel workflow #1
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 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 |