Allow installation of extras in GitHub action (#2630)

This commit is contained in:
Ofek Lev
2025-10-26 13:29:26 +00:00
committed by GitHub
parent 168717b5c5
commit a3af13a337
3 changed files with 44 additions and 12 deletions
+33 -5
View File
@@ -17,6 +17,10 @@ inputs:
description: 'Build a specific wheel only. No need for arch/platform if this is set' description: 'Build a specific wheel only. No need for arch/platform if this is set'
required: false required: false
default: '' default: ''
extras:
description: 'Comma-separated list of extras to install'
required: false
default: ''
branding: branding:
icon: package icon: package
color: yellow color: yellow
@@ -42,6 +46,10 @@ runs:
from pathlib import Path from pathlib import Path
from subprocess import run from subprocess import run
EXTRAS = set(e.strip() for e in "${{ inputs.extras }}".split(",") if e.strip())
if sys.platform == "linux":
EXTRAS.discard("uv")
class EnvBuilder(venv.EnvBuilder): class EnvBuilder(venv.EnvBuilder):
def __init__(self): def __init__(self):
@@ -53,7 +61,10 @@ runs:
def post_setup(self, context): def post_setup(self, context):
super().post_setup(context) super().post_setup(context)
self.bin_path = Path(context.env_exe).parent self.bin_path = Path(context.env_exe).parent
run([sys.executable, "-m", "pip", "--python", context.env_exe, "install", r"${{ github.action_path }}"], check=True) install_spec = r"${{ github.action_path }}"
if EXTRAS:
install_spec += f"[{','.join(sorted(EXTRAS))}]"
run([sys.executable, "-m", "pip", "--python", context.env_exe, "install", install_spec], check=True)
print("::group::Install cibuildwheel") print("::group::Install cibuildwheel")
@@ -62,30 +73,47 @@ runs:
shutil.rmtree(venv_path) shutil.rmtree(venv_path)
builder = EnvBuilder() builder = EnvBuilder()
builder.create(venv_path) builder.create(venv_path)
cibw_path = [path for path in builder.bin_path.glob("cibuildwheel*") if path.stem == "cibuildwheel"][0] exposed_binaries = {"cibuildwheel"}
if "uv" in EXTRAS:
exposed_binaries.add("uv")
clean_bin_path = builder.bin_path.parent / f"{builder.bin_path.name}.clean"
clean_bin_path.mkdir()
for path in list(builder.bin_path.iterdir()):
if path.stem in exposed_binaries:
try:
os.symlink(path, clean_bin_path / path.name)
except OSError:
import shutil
shutil.copy2(path, clean_bin_path / path.name)
full_path = f"{clean_bin_path}{os.pathsep}{os.environ['PATH']}"
with open(os.environ["GITHUB_OUTPUT"], "at") as f: with open(os.environ["GITHUB_OUTPUT"], "at") as f:
f.write(f"cibw-path={cibw_path}\n") f.write(f"updated-path={full_path}\n")
print("::endgroup::") print("::endgroup::")
EOF EOF
shell: bash shell: bash
# Redirecting stderr to stdout to fix interleaving issue in Actions. # Redirecting stderr to stdout to fix interleaving issue in Actions.
- run: > - run: >
"${{ steps.cibw.outputs.cibw-path }}" cibuildwheel
"${{ inputs.package-dir }}" "${{ inputs.package-dir }}"
${{ inputs.output-dir != '' && format('--output-dir "{0}"', inputs.output-dir) || ''}} ${{ inputs.output-dir != '' && format('--output-dir "{0}"', inputs.output-dir) || ''}}
${{ inputs.config-file != '' && format('--config-file "{0}"', inputs.config-file) || ''}} ${{ inputs.config-file != '' && format('--config-file "{0}"', inputs.config-file) || ''}}
${{ inputs.only != '' && format('--only "{0}"', inputs.only) || ''}} ${{ inputs.only != '' && format('--only "{0}"', inputs.only) || ''}}
2>&1 2>&1
env:
PATH: "${{ steps.cibw.outputs.updated-path }}"
shell: bash shell: bash
if: runner.os != 'Windows' if: runner.os != 'Windows'
# Windows needs powershell to interact nicely with Meson # Windows needs powershell to interact nicely with Meson
- run: > - run: >
& "${{ steps.cibw.outputs.cibw-path }}" cibuildwheel
"${{ inputs.package-dir }}" "${{ inputs.package-dir }}"
${{ inputs.output-dir != '' && format('--output-dir "{0}"', inputs.output-dir) || ''}} ${{ inputs.output-dir != '' && format('--output-dir "{0}"', inputs.output-dir) || ''}}
${{ inputs.config-file != '' && format('--config-file "{0}"', inputs.config-file) || ''}} ${{ inputs.config-file != '' && format('--config-file "{0}"', inputs.config-file) || ''}}
${{ inputs.only != '' && format('--only "{0}"', inputs.only) || ''}} ${{ inputs.only != '' && format('--only "{0}"', inputs.only) || ''}}
env:
PATH: "${{ steps.cibw.outputs.updated-path }}"
shell: pwsh shell: pwsh
if: runner.os == 'Windows' if: runner.os == 'Windows'
+3 -1
View File
@@ -23,7 +23,9 @@ To build Linux, macOS, and Windows wheels using GitHub Actions, create a `.githu
Use `env:` to pass [build options](options.md) and `with:` to set Use `env:` to pass [build options](options.md) and `with:` to set
`package-dir: .`, `output-dir: wheelhouse` and `config-file: ''` `package-dir: .`, `output-dir: wheelhouse` and `config-file: ''`
locations (those values are the defaults). locations (those values are the defaults). You can also pass a
comma-separated list of extras to install additional packages.
For example, `extras: "uv"` to install UV into the virtual environment.
!!! tab "pipx" !!! tab "pipx"
The GitHub Actions runners have pipx installed, so you can easily build in The GitHub Actions runners have pipx installed, so you can easily build in
+8 -6
View File
@@ -470,14 +470,16 @@ Default: `build`
Choose which build frontend to use. Choose which build frontend to use.
You can use "build\[uv\]", which will use an external [uv][] everywhere You can use "build\[uv\]", which will use an external [UV][] everywhere
possible, both through `--installer=uv` passed to build, as well as when making possible, both through `--installer=uv` passed to build, as well as when making
all build and test environments. This will generally speed up cibuildwheel. all build and test environments. This will generally speed up cibuildwheel.
Make sure you have an external uv on Windows and macOS, either by Make sure you have an external UV on Windows and macOS, either by
pre-installing it, or installing cibuildwheel with the uv extra, pre-installing it, or installing cibuildwheel with the `uv` extra, which is
`cibuildwheel[uv]`. uv currently does not support Windows on ARM, possible by manually passing `cibuildwheel[uv]` to installers or by using the
musllinux on s390x, Android, or iOS. Legacy dependencies like `extras` option in the [cibuildwheel action](ci-services.md#github-actions).
setuptools on Python < 3.12 and pip are not installed if using uv. UV currently does not support Android, iOS nor musllinux on s390x. Legacy
dependencies like setuptools on Python < 3.12 and pip are not installed if
using UV.
On Android and Pyodide, only "build" is supported. On Android and Pyodide, only "build" is supported.