test(e2e): add Tier 1 plan — copy file / relative path (#1032) #39
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 ] | |
| # Split-pipeline E2E UI workflow. | |
| # | |
| # lint → tslint + checkstyle (ubuntu, OS-agnostic) | |
| # discover-plans → emits a matrix of test-plan basenames | |
| # | |
| # build-linux ─┐ | |
| # e2e-linux (×plan) ┤ | |
| # ├──→ analyze → unified summary covering both OSes | |
| # build-windows ─┤ | |
| # e2e-windows (×plan)┘ | |
| # | |
| # Per-OS pipelines run completely independently: Linux e2e jobs do NOT | |
| # wait for the Windows VSIX build (and vice versa), so a slow Windows | |
| # build cannot delay the start of Linux e2e plans. Each matrix cell | |
| # surfaces as its own PR check, so failures are visible without an | |
| # extra gate job. | |
| # | |
| # Inspired by vscode-java-pack/.github/workflows/e2e-autotest.yml. | |
| jobs: | |
| # ── Lint + Checkstyle (OS-agnostic) ───────────────────── | |
| lint: | |
| name: Lint & Checkstyle | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| 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: Lint | |
| run: npm run tslint | |
| - name: Checkstyle | |
| working-directory: ./jdtls.ext | |
| run: ./mvnw checkstyle:check | |
| # ── 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) ──────────────────────────────── | |
| 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: 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 | |
| # ── E2E plans (Linux) — depends only on Linux build ───── | |
| e2e-linux: | |
| name: E2E 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 (Xvfb) | |
| 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 }} | |
| shell: bash | |
| 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 | |
| # ── E2E plans (Windows) — depends only on Windows build ─ | |
| e2e-windows: | |
| name: E2E 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 }} | |
| shell: pwsh | |
| 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 | |
| [ -d "$dir" ] || continue | |
| 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 | |
| [ -d "$dir" ] || continue | |
| 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 |