Skip to content

chore: improve java upgrade telemetry tracking and extension installation flow #24

chore: improve java upgrade telemetry tracking and extension installation flow

chore: improve java upgrade telemetry tracking and extension installation flow #24

Workflow file for this run

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