Skip to content

Fix Windows CI failure: disable symlinks during dependency installation - #48

Merged
harell merged 5 commits into
masterfrom
copilot/fix-jupyterlab-widget-installation
Feb 10, 2026
Merged

Fix Windows CI failure: disable symlinks during dependency installation#48
harell merged 5 commits into
masterfrom
copilot/fix-jupyterlab-widget-installation

Conversation

Copilot AI commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

Windows CI jobs fail when installing jupyterlab-widgets==3.0.16 due to restricted symlink creation. The project configures uv with link-mode = "symlink" in pyproject.toml, which triggers this Windows limitation.

Changes

  • Added UV_NO_SYMLINKS: "true" environment variable at the job level in .github/workflows/ci.yml

This configuration:

  • Sets the environment variable at the job level (not step level) to ensure it applies consistently to all uv invocations
  • Uses the string value "true" instead of numeric 1 for proper uv interpretation
  • Overrides the symlink behavior for all CI platforms while preserving local development configuration
Original prompt

This section details on the original issue you should resolve

<issue_title>The failing job encountered an error during installation of jupyterlab-widget</issue_title>
<issue_description>The failing job encountered an error during installation of jupyterlab-widgets==3.0.16 due to a failed symlink creation on Windows:

error: Failed to install: jupyterlab_widgets-3.0.16-py3-none-any.whl Caused by: failed to symlink ...\jupyterlab-manager\static\packages_base_lib_index_js-webpack_sharing_consume_default_jquer

This is a known issue with some Python wheel packages on Windows when using tools that attempt to create symlinks, since the Windows environment often restricts symlinks by default.

Solution:

Add the --no-symlink option to the command that installs dependencies in your workflow (if supported).
For uv, try setting the environment variable UV_NO_SYMLINKS to 1 before installation. Update your Setup dependencies step in .github/workflows/ci.yml:
YAML

  • name: Setup dependencies
    run: |
    uv python pin ${{ matrix.python-version }}
    uv export --no-managed-python --no-group doc --resolution ${{ matrix.resolution }} > ci-requirements.txt
    uv pip install --system -r ci-requirements.txt
    env:
    UV_NO_SYMLINKS: 1
    Alternatively, upgrade uv and jupyterlab-widgets to their latest versions if possible, as recent releases may have fixed this issue.

These changes should resolve the symlink error and allow the workflow to complete successfully on Windows runners.</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Co-authored-by: harell <7226303+harell@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix installation error for jupyterlab-widgets on Windows Fix Windows CI failure: disable symlinks during dependency installation Feb 10, 2026
Copilot AI requested a review from harell February 10, 2026 07:10
@harell

harell commented Feb 10, 2026

Copy link
Copy Markdown
Contributor

@copilot The job is failing during dependency installation on Windows because the installer is trying to create a symlink while installing jupyterlab-widgets==3.0.16, and that symlink operation fails on the GitHub-hosted Windows runner:

  • Error in logs: failed to symlink file ... jupyterlab_widgets-3.0.16 ...
  • This is a common Windows limitation (symlink permissions / long paths / file system semantics), and it can happen even when you intend to disable symlinks.

Fix: ensure uv truly does not use symlinks on Windows

In your workflow, you already set UV_NO_SYMLINKS: 1, but the failure indicates uv still attempted a symlink. The most reliable fix is to set the env var to the value uv expects and scope it explicitly for Windows (and/or set it globally for the job).

Update .github/workflows/ci.yml (ref: 7b792d9888767009219eb2b323c2632682a9bde7) around the “Setup dependencies” step.

Option A (recommended): set a job-level env for Windows

Add this under jobs.tests.env: so it applies consistently:

jobs:
  tests:
    runs-on: ${{ matrix.os }}
    env:
      PYTHONIOENCODING: utf-8
      UV_NO_SYMLINKS: "true"

Then remove the step-level UV_NO_SYMLINKS block (optional, but keeps things clean).

Option B: set it only for Windows in the dependencies step

Replace the env: block in “Setup dependencies” with:

      - name: Setup dependencies
        run: |
          uv python pin ${{ matrix.python-version }}
          uv export --no-managed-python --no-group doc --resolution ${{ matrix.resolution }} > ci-requirements.txt 
          uv pip install --system -r ci-requirements.txt
        env:
          UV_NO_SYMLINKS: ${{ matrix.os == 'windows-latest' && 'true' || '' }}

(If you prefer clarity, you can instead split into two dependency steps: one with the env var for Windows and one without for other OSes.)

Why this solves it

The failure is specifically: Caused by: failed to symlink file ... while installing a wheel containing JupyterLab extension assets. Forcing uv into “copy mode” (no symlinks) avoids the Windows symlink operation entirely, which is the point of failure.

If you apply the job-level env (Option A), it also ensures the setting can’t be missed by any other uv invocation in the job.

Co-authored-by: harell <7226303+harell@users.noreply.github.com>

Copilot AI commented Feb 10, 2026

Copy link
Copy Markdown
Contributor Author

@copilot The job is failing during dependency installation on Windows because the installer is trying to create a symlink while installing jupyterlab-widgets==3.0.16, and that symlink operat...

Fixed in ee1d25b. Moved UV_NO_SYMLINKS to job-level environment variables with string value "true" and removed the step-level env block for consistency.

@t-t-sonarqube

t-t-sonarqube Bot commented Feb 10, 2026

Copy link
Copy Markdown

@harell
harell marked this pull request as ready for review February 10, 2026 08:10
@harell
harell merged commit 2ebf1b5 into master Feb 10, 2026
15 checks passed
@harell
harell deleted the copilot/fix-jupyterlab-widget-installation branch February 10, 2026 08:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The failing job encountered an error during installation of jupyterlab-widget

2 participants