feat(workspaces): IPC API and extension-side data layer for the panel #3588
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: CI | |
| on: | |
| push: | |
| branches: | |
| - main | |
| pull_request: | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| jobs: | |
| lint: | |
| name: Lint | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Setup pnpm, Node.js, and dependencies | |
| uses: ./.github/actions/setup | |
| - run: pnpm typecheck | |
| - run: pnpm format:check | |
| - run: pnpm lint | |
| - run: pnpm build | |
| test-unit: | |
| name: Unit Test (${{ matrix.name }}, Electron ${{ matrix.electron-version }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| # Minimum supported version: VS Code 1.105 (Sept 2025) -> Electron 37 -> Node 22 | |
| # See https://github.com/ewanharris/vscode-versions for version mapping. | |
| include: | |
| - { os: ubuntu-24.04, name: Linux, electron-version: "37" } | |
| - { os: ubuntu-24.04, name: Linux, electron-version: "latest" } | |
| - { | |
| os: windows-2025-vs2026, | |
| name: Windows, | |
| electron-version: "latest", | |
| } | |
| - { os: macos-15, name: macOS, electron-version: "latest" } | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Setup pnpm, Node.js, and dependencies | |
| uses: ./.github/actions/setup | |
| - name: Run tests with Electron ${{ matrix.electron-version }} | |
| run: ./scripts/test-electron.sh ${{ matrix.electron-version }} | |
| shell: bash | |
| env: | |
| CI: true | |
| test-integration: | |
| name: Integration Test (${{ matrix.name }}, VS Code ${{ matrix.vscode-version }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - { os: ubuntu-24.04, name: Linux, vscode-version: "1.105.0" } | |
| - { os: ubuntu-24.04, name: Linux, vscode-version: "stable" } | |
| - { os: windows-2025-vs2026, name: Windows, vscode-version: "stable" } | |
| - { os: macos-15, name: macOS, vscode-version: "stable" } | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Setup pnpm, Node.js, and dependencies | |
| uses: ./.github/actions/setup | |
| - run: pnpm build | |
| - name: Run integration tests on VS Code ${{ matrix.vscode-version }} | |
| # xvfb only exists on Linux; on Windows/macOS the runner has a real display. | |
| run: ${{ runner.os == 'Linux' && 'xvfb-run -a' || '' }} pnpm test:integration --label "VS Code ${{ matrix.vscode-version }}" | |
| shell: bash | |
| pixel: | |
| name: Pixel | |
| runs-on: ubuntu-24.04 | |
| # Forks and Dependabot can't read the PIXEL_KEY secret. | |
| if: github.repository_owner == 'coder' && github.actor != 'dependabot[bot]' | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Setup pnpm, Node.js, and dependencies | |
| uses: ./.github/actions/setup | |
| - name: Get Playwright version | |
| id: playwright-version | |
| run: echo "version=$(pnpm exec playwright-core --version | awk '{print $2}')" >> "$GITHUB_OUTPUT" | |
| # Cache the browser to avoid relying on azure.archive.ubuntu.com, which | |
| # can be flaky. Only the default branch is trusted to write the cache, | |
| # so PR runs cannot poison it. | |
| - name: Restore Chromium cache | |
| id: playwright-chromium-cache | |
| uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: ~/.cache/ms-playwright | |
| key: playwright-chromium-${{ runner.os }}-${{ steps.playwright-version.outputs.version }} | |
| - name: Install Chromium | |
| run: pnpm exec playwright-core install chromium | |
| timeout-minutes: 5 | |
| - name: Save Chromium cache | |
| if: github.ref == 'refs/heads/main' && steps.playwright-chromium-cache.outputs.cache-hit != 'true' | |
| uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: ~/.cache/ms-playwright | |
| key: ${{ steps.playwright-chromium-cache.outputs.cache-primary-key }} | |
| # Builds the Storybook (buildCommand in pixel.jsonc) and snapshots it. | |
| - name: Snapshot | |
| run: pnpm exec pixel-storybook | |
| env: | |
| PIXEL_KEY: ${{ secrets.PIXEL_KEY }} | |
| # On pull_request, github.sha is a synthetic merge commit, not the PR head. | |
| PIXEL_COMMIT: ${{ github.event.pull_request.head.sha || github.sha }} | |
| # Auto-approve on mainline to avoid blocking CI after squash merges. | |
| PIXEL_AUTO_REVIEW: ${{ github.ref == 'refs/heads/main' }} | |
| package: | |
| name: Package | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - name: Setup pnpm, Node.js, and dependencies | |
| uses: ./.github/actions/setup | |
| - name: Get version from package.json | |
| id: version | |
| run: | | |
| VERSION=$(node -e "console.log(require('./package.json').version)") | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| echo "Version: $VERSION" | |
| - name: Setup package path | |
| id: setup | |
| run: | | |
| EXTENSION_NAME=$(node -e "console.log(require('./package.json').name)") | |
| # Add commit SHA for CI builds | |
| SHORT_SHA=$(git rev-parse --short HEAD) | |
| PACKAGE_NAME="${EXTENSION_NAME}-${{ steps.version.outputs.version }}-${SHORT_SHA}.vsix" | |
| echo "packageName=$PACKAGE_NAME" >> $GITHUB_OUTPUT | |
| - name: Build extension | |
| run: pnpm build:production | |
| - name: Package extension | |
| run: pnpm vsce package --no-dependencies --out "${{ steps.setup.outputs.packageName }}" | |
| - name: Upload artifact (PR) | |
| if: github.event_name == 'pull_request' | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| path: ${{ steps.setup.outputs.packageName }} | |
| if-no-files-found: error | |
| retention-days: 7 | |
| archive: false | |
| - name: Upload artifact (main) | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| path: ${{ steps.setup.outputs.packageName }} | |
| if-no-files-found: error | |
| archive: false |