Skip to content

[craftax] Add native Classic and full Craftax environments (#433) #1127

[craftax] Add native Classic and full Craftax environments (#433)

[craftax] Add native Classic and full Craftax environments (#433) #1127

Workflow file for this run

name: Release PyPI Wheel
on:
push:
branches:
- main
tags:
- v*
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
release-macos:
name: release-macos (py${{ matrix.python-version }})
runs-on: macos-14
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
python-version: >-
${{ fromJSON(
(github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v'))
&& '["3.12", "3.13", "3.14"]'
|| '["3.12"]'
) }}
env:
HOMEBREW_NO_AUTO_UPDATE: "1"
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: actions/setup-go@v7
with:
go-version: "1.27"
- uses: actions/setup-java@v6
with:
distribution: temurin
java-version: "25"
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-version }}
- name: Install latest CMake
run: |
python -m pip install --upgrade cmake
CMAKE_BIN_DIR="$(python -c "import cmake; print(cmake.CMAKE_BIN_DIR)")"
CMAKE_BIN="$CMAKE_BIN_DIR/cmake"
echo "$CMAKE_BIN_DIR" >> "$GITHUB_PATH"
sudo ln -sfn "$CMAKE_BIN" /usr/local/bin/cmake
PATH="$CMAKE_BIN_DIR:$PATH" cmake --version
- name: Install macOS dependencies
run: |
brew install ninja swig qtbase
sudo ln -sfn "$(brew --prefix ninja)/bin/ninja" /usr/local/bin/ninja
echo "BAZEL_RULES_QT_DIR=$(brew --prefix qtbase)" >> "$GITHUB_ENV"
- name: Install bazelisk
run: |
go install github.com/bazelbuild/bazelisk@latest
echo "$HOME/go/bin" >> "$GITHUB_PATH"
- name: Build
run: |
rm -rf dist wheelhouse
make RELEASE_PYTHON=${{ matrix.python-version }} pypi-wheel
python -m pip install wheelhouse/*.whl --force-reinstall
- name: Test
run: |
make release-test
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: wheel-macos-${{ matrix.python-version }}
path: wheelhouse/
if-no-files-found: error
release-linux:
name: release-linux (${{ matrix.arch }}, py${{ matrix.python-version }})
runs-on: ${{ matrix.runner }}
container: ${{ matrix.container }}
timeout-minutes: 120
env:
BAZEL_RULES_QT_DIR: /opt/envpool-qt6
WHEEL_LICENSE_DIR: /opt/envpool-qt6/licenses/qt6
MUJOCO_GL: egl
EGL_PLATFORM: surfaceless
LIBGL_ALWAYS_SOFTWARE: "1"
MESA_LOADER_DRIVER_OVERRIDE: llvmpipe
GALLIUM_DRIVER: llvmpipe
strategy:
fail-fast: false
matrix:
include: >-
${{ fromJSON(
(github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v'))
&& '[{"arch":"x86_64","runner":"ubuntu-24.04","container":"quay.io/pypa/manylinux_2_28_x86_64","auditwheel-plat":"manylinux_2_28_x86_64","python-version":"3.12"},{"arch":"x86_64","runner":"ubuntu-24.04","container":"quay.io/pypa/manylinux_2_28_x86_64","auditwheel-plat":"manylinux_2_28_x86_64","python-version":"3.13"},{"arch":"x86_64","runner":"ubuntu-24.04","container":"quay.io/pypa/manylinux_2_28_x86_64","auditwheel-plat":"manylinux_2_28_x86_64","python-version":"3.14"},{"arch":"aarch64","runner":"ubuntu-24.04-arm","container":"quay.io/pypa/manylinux_2_28_aarch64","auditwheel-plat":"manylinux_2_28_aarch64","python-version":"3.12"},{"arch":"aarch64","runner":"ubuntu-24.04-arm","container":"quay.io/pypa/manylinux_2_28_aarch64","auditwheel-plat":"manylinux_2_28_aarch64","python-version":"3.13"},{"arch":"aarch64","runner":"ubuntu-24.04-arm","container":"quay.io/pypa/manylinux_2_28_aarch64","auditwheel-plat":"manylinux_2_28_aarch64","python-version":"3.14"}]'
|| '[{"arch":"x86_64","runner":"ubuntu-24.04","container":"quay.io/pypa/manylinux_2_28_x86_64","auditwheel-plat":"manylinux_2_28_x86_64","python-version":"3.12"},{"arch":"aarch64","runner":"ubuntu-24.04-arm","container":"quay.io/pypa/manylinux_2_28_aarch64","auditwheel-plat":"manylinux_2_28_aarch64","python-version":"3.12"}]'
) }}
steps:
- uses: actions/checkout@v7
- uses: actions/setup-go@v7
with:
go-version: "1.27"
- uses: actions/setup-java@v6
with:
distribution: temurin
java-version: "25"
- name: Install build dependencies
run: |
dnf install -y git curl wget zsh gcc gcc-c++ make tmux mesa-libEGL-devel mesa-libGL-devel libglvnd-devel mesa-dri-drivers
dnf clean all
go install github.com/bazelbuild/bazelisk@latest
ln -sf /root/go/bin/bazelisk /usr/local/bin/bazelisk
ln -sf /root/go/bin/bazelisk /usr/local/bin/bazel
- name: Set up Python ${{ matrix.python-version }}
shell: bash
run: |
case "${{ matrix.python-version }}" in
3.12) PYBIN=/opt/python/cp312-cp312/bin ;;
3.13) PYBIN=/opt/python/cp313-cp313/bin ;;
3.14) PYBIN=/opt/python/cp314-cp314/bin ;;
*) echo "unsupported python version: ${{ matrix.python-version }}" >&2; exit 1 ;;
esac
echo "$PYBIN" >> "$GITHUB_PATH"
"$PYBIN/python3" --version
- name: Install CMake and Ninja
shell: bash
run: |
python -m pip install --upgrade cmake ninja
CMAKE_BIN_DIR="$(python -c "import cmake; print(cmake.CMAKE_BIN_DIR)")"
CMAKE_BIN="$CMAKE_BIN_DIR/cmake"
NINJA_BIN="$(python -c 'import sysconfig; print(sysconfig.get_path("scripts") + "/ninja")')"
echo "$CMAKE_BIN_DIR" >> "$GITHUB_PATH"
ln -sfn "$CMAKE_BIN" /usr/local/bin/cmake
# The ARM64 Bazel toolchain finds Ninja through the action PATH.
ln -sfn "$NINJA_BIN" /usr/local/bin/ninja
PATH="$CMAKE_BIN_DIR:$PATH" cmake --version
PATH=/bin:/usr/bin:/usr/local/bin ninja --version
- name: Cache Qt 6
id: qt-cache
uses: actions/cache@v6
with:
path: /opt/envpool-qt6
key: qt-manylinux_2_28-${{ matrix.arch }}-${{ hashFiles('third_party/qt/build_release.sh') }}
- name: Build Qt 6 from source
if: steps.qt-cache.outputs.cache-hit != 'true'
run: bash third_party/qt/build_release.sh "$BAZEL_RULES_QT_DIR"
- name: Prefer system libstdc++ for Mesa
shell: bash
run: |
echo "LD_PRELOAD=$(g++ -print-file-name=libstdc++.so.6)" >> "$GITHUB_ENV"
- name: Build
run: |
rm -rf dist wheelhouse
make PYPI_WHEEL_PLAT=${{ matrix.auditwheel-plat }} pypi-wheel
python -m pip install wheelhouse/*.whl --force-reinstall
- name: Test with only the bundled Qt runtime
shell: bash
run: |
mv "$BAZEL_RULES_QT_DIR" "${BAZEL_RULES_QT_DIR}-sdk-unused"
trap 'mv "${BAZEL_RULES_QT_DIR}-sdk-unused" "$BAZEL_RULES_QT_DIR"' EXIT
make PROCGEN_QT_RUNTIME=bundled release-test
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: wheel-linux-${{ matrix.arch }}-${{ matrix.python-version }}
path: wheelhouse/
if-no-files-found: error
release-windows:
name: release-windows (py${{ matrix.python-version }})
runs-on: windows-2022
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
python-version: >-
${{ fromJSON(
(github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v'))
&& '["3.12", "3.13", "3.14"]'
|| '["3.12"]'
) }}
env:
BAZEL_SH: C:/Program Files/Git/usr/bin/bash.exe
MESA_GL_VERSION_OVERRIDE: 4.5COMPAT
MSYS2_ARG_CONV_EXCL: "*"
MSYS_NO_PATHCONV: "1"
USE_BAZEL_VERSION: "9.2.0"
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: actions/setup-go@v7
with:
go-version: "1.27"
- uses: ilammy/msvc-dev-cmd@v1
- uses: actions/setup-java@v6
with:
distribution: temurin
java-version: "25"
- name: Shorten temp path
shell: pwsh
run: |
New-Item -ItemType Directory -Path C:\tmp -Force | Out-Null
Add-Content -Path $env:GITHUB_ENV -Value "TMP=C:\tmp"
Add-Content -Path $env:GITHUB_ENV -Value "TEMP=C:\tmp"
Add-Content -Path $env:GITHUB_ENV -Value "TMPDIR=C:\tmp"
- name: Install Windows dependencies
shell: pwsh
run: |
choco install -y cmake make ninja strawberryperl swig llvm
if (-not (Test-Path "C:\Program Files\LLVM\bin\llvm-strip.exe")) {
throw "llvm-strip.exe was not installed"
}
Add-Content -Path $env:GITHUB_PATH -Value "C:\Program Files\LLVM\bin"
- name: Create Mesa directory
shell: pwsh
run: |
New-Item -ItemType Directory -Path (Join-Path $env:GITHUB_WORKSPACE ".mesa") -Force | Out-Null
- name: Install Mesa software OpenGL
uses: f3d-app/install-mesa-windows-action@v3
with:
path: ${{ github.workspace }}\.mesa
- name: Export Mesa location
shell: pwsh
run: |
Add-Content -Path $env:GITHUB_ENV -Value "ENVPOOL_DLL_DIR=$env:GITHUB_WORKSPACE\.mesa"
Add-Content -Path $env:GITHUB_PATH -Value "$env:GITHUB_WORKSPACE\.mesa"
- name: Install Qt 6
uses: jurplel/install-qt-action@v4
with:
version: "6.11.1"
# Qt 6.11 repository layout support; not yet in an aqt release.
aqtsource: git+https://github.com/miurahr/aqtinstall.git@8c3695d4a4e1ceabf6a74dc6c79681656dc6b74b
py7zrversion: "==1.1.0"
arch: "win64_msvc2022_64"
set-env: "true"
- name: Export Qt location
shell: pwsh
run: |
Add-Content -Path $env:GITHUB_ENV -Value "BAZEL_RULES_QT_DIR=$env:QT_ROOT_DIR"
Add-Content -Path $env:GITHUB_PATH -Value (Join-Path $env:QT_ROOT_DIR "bin")
Add-Content -Path $env:GITHUB_PATH -Value "C:\Program Files\Git\usr\bin"
- name: Collect Qt licenses and notices
shell: bash
run: |
qt_prefix=$(cygpath -u "$QT_ROOT_DIR")
bash third_party/qt/build_release.sh --licenses-only "$qt_prefix"
echo "WHEEL_LICENSE_DIR=$(cygpath -m "$qt_prefix/licenses/qt6")" >> "$GITHUB_ENV"
- name: Install bazelisk
shell: pwsh
run: |
go install github.com/bazelbuild/bazelisk@latest
Add-Content -Path $env:GITHUB_PATH -Value (Join-Path $HOME "go/bin")
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-version }}
- name: Install latest CMake
shell: pwsh
run: |
python -m pip install --upgrade cmake
$cmakeBinDir = python -c "import cmake; print(cmake.CMAKE_BIN_DIR)"
Add-Content -Path $env:GITHUB_PATH -Value $cmakeBinDir
& (Join-Path $cmakeBinDir "cmake.exe") --version
- name: Build
shell: bash
run: |
rm -rf dist wheelhouse
make RELEASE_PYTHON=${{ matrix.python-version }} pypi-wheel
python -m pip install wheelhouse/*.whl --force-reinstall
- name: Test
shell: bash
run: |
make release-test
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: wheel-windows-${{ matrix.python-version }}
path: wheelhouse/
if-no-files-found: error
publish:
if: startsWith(github.ref, 'refs/tags')
runs-on: ubuntu-latest
needs: [release-linux, release-macos, release-windows]
permissions:
actions: read
contents: write
steps:
- uses: actions/download-artifact@v8
with:
pattern: wheel-*
path: artifact
merge-multiple: true
- name: Move files so the next action can find them
run: |
mkdir dist && mv artifact/* dist/
ls dist/
- name: Publish distribution to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}
skip-existing: true
- name: Create GitHub release and upload wheels
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release view "${GITHUB_REF_NAME}" >/dev/null 2>&1 || \
gh release create "${GITHUB_REF_NAME}" \
--title "${GITHUB_REF_NAME}" \
--generate-notes \
--verify-tag
gh release upload "${GITHUB_REF_NAME}" dist/*.whl --clobber