Skip to content

macOS arm64 + Insiders: spawn .../Contents/MacOS/Electron ENOENT (CI reproducer for #349) #348

Description

@miguelcolmenares

Summary

On darwin-arm64 GitHub-hosted runners (macos-latest, Apple Silicon), @vscode/test-electron@3.0.0 downloads the VS Code Insiders archive successfully, then fails to launch it:

✔ Downloaded VS Code (07b4ff1883f94da91f6d698744fc7c3638b59720) into
   .vscode-test/vscode-darwin-arm64-insiders
Test error: Error: spawn .../Visual Studio Code - Insiders.app/Contents/MacOS/Electron ENOENT

The same test suite passes on ubuntu-latest + Insiders, windows-latest + Insiders, and every macOS Stable / pinned-version cell on the same commit. The failure is scoped strictly to darwin-arm64 + Insiders.

Root cause

Fully diagnosed in #349 (thanks @aasimkhan30). Summary of that thread as it applies here:

  • VS Code renamed the macOS executable from Electron to the product name (Code / Code - Insiders) in microsoft/vscode#291948, merged 2026-02-03, first shipping in 1.110.
  • The Electron compatibility symlink was removed in microsoft/vscode#326502, merged 2026-07-20.
  • @vscode/test-electron still hardcodes the old Electron path, so any post-symlink-removal build produces the ENOENT above.

darwin-arm64 + Insiders surfaced this first because Insiders leads Stable through both the rename and the symlink removal. The same failure will reach darwin-arm64 + Stable as soon as Stable crosses the 2026-07-20 cutoff.

This issue is the CI-visible reproducer that led me to #349 before the root cause was clear. Keeping it open as the downstream-facing counterpart to #349 so consumers hitting the ENOENT symptom can find the workaround.

Environment

@vscode/test-electron 3.0.0
@vscode/test-cli 0.0.15
Node.js 20.20.2 (also reproduces on 24)
Runner macos-latest on GitHub Actions (Apple Silicon / darwin-arm64)
VS Code channel insiders
Downloaded commit 07b4ff1883f94da91f6d698744fc7c3638b59720 (~340 MB archive)

Steps to reproduce

  1. Set up a VS Code extension with @vscode/test-cli and a .vscode-test.mjs that supports insiders.
  2. Run npm test on a GitHub-hosted macos-latest runner (arm64).
  3. Observe: download succeeds, launcher throws ENOENT.

Minimal .vscode-test.mjs:

import { defineConfig } from '@vscode/test-cli';

export default defineConfig({
  files: 'out/test/**/*.test.js',
  version: process.env.VSCODE_VERSION || 'stable', // set VSCODE_VERSION=insiders
});

Minimal workflow step:

- uses: coactions/setup-xvfb@v1
  with:
    run: npm test
  env:
    VSCODE_VERSION: 'insiders'

Reproduction repository

Workaround currently deployed

Drop macos-latest from the Insiders matrix. macOS arm64 coverage is retained via Stable and minimum-version workflows, both running on macos-latest. Reference implementation: miguelcolmenares/css-js-minifier#175.

Intel-fallback runners (macos-13, macos-15-intel) are not a viable long-term workaround:

  • macos-13 was retired 2025-12-04 (actions/runner-images#13046); jobs targeting it queue indefinitely.
  • macos-15-intel is a transitional label, retiring Fall 2027 per the 2025-09-19 GitHub Changelog.
  • Rosetta 2 is available only through macOS 27 and reduced to legacy games starting with macOS 28 (Apple HT102527).
  • @vscode/test-cli's IBaseTestConfiguration does not expose a platform field, so consumers can't force an x64 download on an arm64 host without dropping to @vscode/test-electron's programmatic API.

Ask

Ship the fix proposed in #349: resolve the macOS executable dynamically via CFBundleExecutable / product.nameShort, with Electron as a fallback for pre-1.110 builds. Downstream consumers can then restore macos-latest (arm64) to their Insiders CI matrices without any Intel/Rosetta bridge.

Happy to test a pre-release against the reproducer above.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions