mirror of
https://github.com/microsoft/vscode.git
synced 2026-09-30 18:46:00 +01:00
* Split Electron unit and integration test jobs Run Electron unit and node tests independently from integration tests on Linux, macOS, and Windows while preserving existing integration check and artifact names. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Limit test runtime downloads Download Electron only for Electron and Remote jobs, and install only the headless Playwright browsers used by Browser jobs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Align browser setup with split test inputs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
296 lines
11 KiB
YAML
296 lines
11 KiB
YAML
on:
|
|
workflow_call:
|
|
inputs:
|
|
job_name:
|
|
type: string
|
|
required: true
|
|
electron_tests:
|
|
type: boolean
|
|
default: false
|
|
browser_tests:
|
|
type: boolean
|
|
default: false
|
|
remote_tests:
|
|
type: boolean
|
|
default: false
|
|
unit_tests:
|
|
type: boolean
|
|
default: true
|
|
integration_tests:
|
|
type: boolean
|
|
default: true
|
|
smoke_tests:
|
|
type: boolean
|
|
default: true
|
|
|
|
jobs:
|
|
macOS-test:
|
|
name: ${{ inputs.job_name }}
|
|
runs-on: macos-26-xlarge
|
|
env:
|
|
ARTIFACT_NAME: ${{ (inputs.electron_tests && 'electron') || (inputs.browser_tests && 'browser') || (inputs.remote_tests && 'remote') || 'unknown' }}${{ (inputs.unit_tests && !inputs.integration_tests && '-unit') || (!inputs.unit_tests && !inputs.integration_tests && inputs.smoke_tests && '-smoke') || '' }}
|
|
NPM_ARCH: arm64
|
|
VSCODE_ARCH: arm64
|
|
steps:
|
|
- name: Checkout microsoft/vscode
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
lfs: true
|
|
|
|
- name: Detect Agent Host E2E changes
|
|
if: ${{ inputs.electron_tests && inputs.integration_tests }}
|
|
id: agent-host-e2e-changes
|
|
uses: ./.github/actions/detect-agent-host-e2e-changes
|
|
with:
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Setup Node.js
|
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
with:
|
|
node-version-file: .nvmrc
|
|
|
|
- name: Restore node_modules cache
|
|
id: cache-node-modules
|
|
uses: ./.github/actions/restore-node-modules
|
|
with:
|
|
key-prefix: node_modules-macos
|
|
key-args: "darwin ${{ env.VSCODE_ARCH }} $(node -p process.arch)"
|
|
|
|
- name: Install dependencies
|
|
if: steps.cache-node-modules.outputs.cache-hit != 'true'
|
|
run: |
|
|
set -e
|
|
c++ --version
|
|
xcode-select -print-path
|
|
python3 -m pip install --break-system-packages setuptools
|
|
|
|
for i in {1..5}; do # try 5 times
|
|
npm ci && break
|
|
if [ $i -eq 5 ]; then
|
|
echo "Npm install failed too many times" >&2
|
|
exit 1
|
|
fi
|
|
echo "Npm install failed $i, trying again..."
|
|
done
|
|
env:
|
|
npm_config_arch: ${{ env.NPM_ARCH }}
|
|
VSCODE_ARCH: ${{ env.VSCODE_ARCH }}
|
|
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
|
|
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
# Avoid using dlopen to load Kerberos on macOS which can cause missing libraries
|
|
# https://github.com/mongodb-js/kerberos/commit/04044d2814ad1d01e77f1ce87f26b03d86692cf2
|
|
# flipped the default to support legacy linux distros which shouldn't happen
|
|
# on macOS.
|
|
GYP_DEFINES: "kerberos_use_rtld=false"
|
|
|
|
- name: Create .build folder
|
|
run: mkdir -p .build
|
|
|
|
- name: Prepare built-in extensions cache key
|
|
run: node build/azure-pipelines/common/computeBuiltInDepsCacheKey.ts > .build/builtindepshash
|
|
|
|
- name: Restore built-in extensions cache
|
|
id: cache-builtin-extensions
|
|
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
with:
|
|
enableCrossOsArchive: true
|
|
path: .build/builtInExtensions
|
|
key: "builtin-extensions-${{ hashFiles('.build/builtindepshash') }}"
|
|
|
|
- name: Download built-in extensions
|
|
if: steps.cache-builtin-extensions.outputs.cache-hit != 'true'
|
|
run: node build/lib/builtInExtensions.ts
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Transpile client and extensions
|
|
run: npm run gulp transpile-client-esbuild transpile-extensions
|
|
|
|
- name: Download Electron
|
|
if: ${{ inputs.electron_tests || inputs.remote_tests }}
|
|
run: |
|
|
set -e
|
|
|
|
for i in {1..3}; do # try 3 times (matching retryCountOnTaskFailure: 3)
|
|
if npm run electron -- ${{ env.VSCODE_ARCH }}; then
|
|
echo "Download successful on attempt $i"
|
|
break
|
|
fi
|
|
|
|
if [ $i -eq 3 ]; then
|
|
echo "Download failed after 3 attempts" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "Download failed on attempt $i, retrying..."
|
|
sleep 5 # optional: add a small delay between retries
|
|
done
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Compile browser integration test runner
|
|
if: ${{ inputs.browser_tests && inputs.integration_tests }}
|
|
working-directory: test/integration/browser
|
|
run: npm run compile
|
|
|
|
- name: Install Playwright Chromium and WebKit
|
|
if: ${{ inputs.browser_tests }}
|
|
run: |
|
|
set -e
|
|
|
|
for i in {1..3}; do
|
|
if npm exec -- playwright install --only-shell chromium webkit; then
|
|
echo "Install successful on attempt $i"
|
|
break
|
|
fi
|
|
|
|
if [ $i -eq 3 ]; then
|
|
echo "Install failed after 3 attempts" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "Install failed on attempt $i, retrying..."
|
|
sleep 5
|
|
done
|
|
|
|
- name: 🧪 Run unit tests (Electron)
|
|
if: ${{ inputs.electron_tests && inputs.unit_tests }}
|
|
timeout-minutes: 15
|
|
run: ./scripts/test.sh --tfs "Unit Tests"
|
|
env:
|
|
VSCODE_SKIP_PRELAUNCH: '1'
|
|
|
|
- name: 🧪 Run unit tests (node.js)
|
|
if: ${{ inputs.electron_tests && inputs.unit_tests }}
|
|
timeout-minutes: 15
|
|
run: npm run test-node
|
|
|
|
- name: 🧪 Run unit tests (Browser, Webkit)
|
|
if: ${{ inputs.browser_tests && inputs.unit_tests }}
|
|
timeout-minutes: 30
|
|
run: npm run test-browser-no-install -- --browser webkit --tfs "Browser Unit Tests"
|
|
env:
|
|
DEBUG: "*browser*"
|
|
|
|
- name: Compile extensions for integration tests & smoke tests
|
|
if: ${{ inputs.integration_tests || inputs.smoke_tests }}
|
|
run: |
|
|
set -e
|
|
npm run gulp \
|
|
compile-extension:configuration-editing \
|
|
compile-extension:css-language-features-server \
|
|
compile-extension:emmet \
|
|
compile-extension:git \
|
|
compile-extension:github-authentication \
|
|
compile-extension:html-language-features-server \
|
|
compile-extension:ipynb \
|
|
compile-extension:notebook-renderers \
|
|
compile-extension:json-language-features-server \
|
|
compile-extension:markdown-language-features \
|
|
compile-extension-media \
|
|
compile-extension:microsoft-authentication \
|
|
compile-extension:typescript-language-features \
|
|
compile-extension:vscode-api-tests \
|
|
compile-extension:vscode-colorize-tests \
|
|
compile-extension:vscode-colorize-perf-tests \
|
|
compile-extension:vscode-test-resolver
|
|
|
|
- name: 🧪 Run integration tests (Electron)
|
|
if: ${{ inputs.electron_tests && inputs.integration_tests }}
|
|
timeout-minutes: 20
|
|
run: ./scripts/test-integration.sh --tfs "Integration Tests"
|
|
env:
|
|
VSCODE_SKIP_AGENT_HOST_E2E: ${{ steps.agent-host-e2e-changes.outputs.affected == 'false' && '1' || '0' }}
|
|
VSCODE_SKIP_PRELAUNCH: '1'
|
|
|
|
- name: 🧪 Run integration tests (Browser, Webkit)
|
|
if: ${{ inputs.browser_tests && inputs.integration_tests }}
|
|
timeout-minutes: 20
|
|
run: ./scripts/test-web-integration.sh --browser webkit
|
|
|
|
- name: 🧪 Run integration tests (Remote)
|
|
if: ${{ inputs.remote_tests && inputs.integration_tests }}
|
|
timeout-minutes: 20
|
|
run: ./scripts/test-remote-integration.sh
|
|
env:
|
|
VSCODE_SKIP_PRELAUNCH: '1'
|
|
|
|
- name: Compile smoke tests
|
|
if: ${{ inputs.smoke_tests }}
|
|
working-directory: test/smoke
|
|
run: npm run compile
|
|
|
|
- name: Compile Copilot Chat extension for smoke tests
|
|
if: ${{ inputs.smoke_tests }}
|
|
working-directory: extensions/copilot
|
|
run: npm run compile
|
|
|
|
- name: Diagnostics before smoke test run
|
|
if: ${{ inputs.smoke_tests && always() }}
|
|
run: ps -ef
|
|
continue-on-error: true
|
|
|
|
- name: 🧪 Run smoke tests (Electron)
|
|
if: ${{ inputs.electron_tests && inputs.smoke_tests }}
|
|
timeout-minutes: 20
|
|
run: npm run smoketest-no-compile -- --tracing
|
|
|
|
- name: Install Squid for network-isolated smoke tests
|
|
if: ${{ inputs.electron_tests && inputs.smoke_tests }}
|
|
run: brew list squid >/dev/null 2>&1 || brew install squid
|
|
|
|
- name: 🧪 Run Agents Window smoke tests through macOS PAC proxy
|
|
if: ${{ inputs.electron_tests && inputs.smoke_tests }}
|
|
timeout-minutes: 40
|
|
run: bash test/smoke/scripts/run-agents-window-network-proxy.sh
|
|
|
|
- name: 🧪 Run Agents Window smoke tests through Kerberos-authenticated macOS PAC proxy
|
|
if: ${{ inputs.electron_tests && inputs.smoke_tests }}
|
|
timeout-minutes: 40
|
|
run: bash test/smoke/scripts/run-agents-window-network-proxy.sh --kerberos
|
|
|
|
- name: 🧪 Run smoke tests (Browser, Chromium)
|
|
if: ${{ inputs.browser_tests && inputs.smoke_tests }}
|
|
timeout-minutes: 20
|
|
run: npm run smoketest-no-compile -- --web --tracing --headless
|
|
|
|
- name: 🧪 Run smoke tests (Remote)
|
|
if: ${{ inputs.remote_tests && inputs.smoke_tests }}
|
|
timeout-minutes: 20
|
|
run: npm run smoketest-no-compile -- --remote --tracing
|
|
|
|
- name: Diagnostics after smoke test run
|
|
if: ${{ inputs.smoke_tests && always() }}
|
|
run: ps -ef
|
|
continue-on-error: true
|
|
|
|
- name: Publish Crash Reports
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
if: failure()
|
|
continue-on-error: true
|
|
with:
|
|
name: ${{ format('crash-dump-macos-{0}-{1}-{2}', env.VSCODE_ARCH, env.ARTIFACT_NAME, github.run_attempt) }}
|
|
path: .build/crashes
|
|
if-no-files-found: ignore
|
|
|
|
# In order to properly symbolify above crash reports
|
|
# (if any), we need the compiled native modules too
|
|
- name: Publish Node Modules
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
if: failure()
|
|
continue-on-error: true
|
|
with:
|
|
name: ${{ format('node-modules-macos-{0}-{1}-{2}', env.VSCODE_ARCH, env.ARTIFACT_NAME, github.run_attempt) }}
|
|
path: node_modules
|
|
if-no-files-found: ignore
|
|
|
|
- name: Publish Log Files
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
if: always()
|
|
continue-on-error: true
|
|
with:
|
|
name: ${{ format('logs-macos-{0}-{1}-{2}', env.VSCODE_ARCH, env.ARTIFACT_NAME, github.run_attempt) }}
|
|
path: .build/logs
|
|
if-no-files-found: ignore
|