[craftax] Add native Classic and full Craftax environments (#433) #2930
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Bazel Build and Test | |
| on: | |
| push: | |
| branches: | |
| - main | |
| pull_request: | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| actions: write | |
| contents: read | |
| jobs: | |
| test-linux-x64: | |
| name: Test (linux-x64) | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 300 | |
| env: | |
| CACHE_BRANCH: ${{ github.head_ref || github.ref_name }} | |
| DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} | |
| # Keep hosted Linux runners responsive during the full MuJoCo/MyoSuite coverage | |
| # build. The default HOST_CPUS-1 parallelism can starve the runner hard | |
| # enough for GitHub Actions to lose communication. | |
| BAZEL_CI_RESOURCE_OPTS: --jobs=2 --local_resources=cpu=2 --local_resources=memory=HOST_RAM*.35 --experimental_disk_cache_gc_max_size=2G --experimental_disk_cache_gc_idle_delay=0s | |
| MUJOCO_GL: egl | |
| EGL_PLATFORM: surfaceless | |
| 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 3.12 | |
| uses: actions/setup-python@v7 | |
| with: | |
| python-version: "3.12" | |
| - name: Install Linux dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y cmake lcov ninja-build swig qt6-base-dev libegl1-mesa-dev libopengl-dev | |
| python -m pip install --upgrade cmake | |
| - name: Restore Bazel caches | |
| uses: actions/cache/restore@v6 | |
| with: | |
| path: | | |
| ~/.cache/bazelisk | |
| ~/.cache/envpool-bazel-repo | |
| ~/.cache/envpool-bazel-disk | |
| key: bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.CACHE_BRANCH }} | |
| restore-keys: | | |
| bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.DEFAULT_BRANCH }}- | |
| bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}- | |
| - name: Install bazelisk | |
| run: | | |
| go install github.com/bazelbuild/bazelisk@latest | |
| echo "$HOME/go/bin" >> "$GITHUB_PATH" | |
| - name: Coverage | |
| run: | | |
| make BAZELOPT="--repository_cache=$HOME/.cache/envpool-bazel-repo --disk_cache=$HOME/.cache/envpool-bazel-disk $BAZEL_CI_RESOURCE_OPTS" \ | |
| BAZEL_TEST_TARGETS="//..." bazel-coverage | |
| mkdir -p coverage | |
| cp bazel-out/_coverage/_coverage_report.dat coverage/lcov.info | |
| python3 scripts/coverage_summary.py \ | |
| --lcov coverage/lcov.info \ | |
| --output-dir coverage \ | |
| --summary-file coverage/summary.md \ | |
| --badge-file coverage/coverage-badge.svg \ | |
| --genhtml-lcov-file coverage/lcov.genhtml.info \ | |
| --repo-root "$GITHUB_WORKSPACE" | |
| - name: Shut down Bazel | |
| if: ${{ always() && !cancelled() }} | |
| continue-on-error: true | |
| run: bazelisk shutdown | |
| - name: Publish coverage summary | |
| run: cat coverage/summary.md >> "$GITHUB_STEP_SUMMARY" | |
| - name: Build coverage site | |
| run: | | |
| genhtml coverage/lcov.genhtml.info \ | |
| --prefix "$GITHUB_WORKSPACE" \ | |
| --branch-coverage \ | |
| --ignore-errors negative,category \ | |
| --legend \ | |
| --output-directory coverage/site \ | |
| --title "EnvPool coverage report" | |
| cp coverage/coverage-badge.svg coverage/site/coverage-badge.svg | |
| - name: Upload coverage artifacts | |
| if: ${{ always() && !cancelled() }} | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: coverage-report-linux-x64-${{ github.sha }} | |
| path: coverage | |
| if-no-files-found: warn | |
| - name: Upload coverage Pages artifact | |
| if: ${{ github.event_name == 'push' }} | |
| uses: actions/upload-pages-artifact@v5 | |
| with: | |
| path: coverage/site | |
| - name: Save Bazel caches | |
| id: save-bazel-caches | |
| if: ${{ always() && !cancelled() }} | |
| uses: actions/cache/save@v6 | |
| with: | |
| path: | | |
| ~/.cache/bazelisk | |
| ~/.cache/envpool-bazel-repo | |
| ~/.cache/envpool-bazel-disk | |
| key: bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.CACHE_BRANCH }}-${{ github.run_id }}-attempt${{ github.run_attempt }} | |
| - name: Prune older Bazel caches | |
| if: ${{ success() && (steps.save-bazel-caches.outcome == 'success' || steps.save-bazel-caches.outcome == 'skipped') }} | |
| continue-on-error: true | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: >- | |
| python scripts/prune_actions_caches.py | |
| --repo "${{ github.repository }}" | |
| --prefix "bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-" | |
| --group-by-branch | |
| --delete-missing-branches | |
| --keep 1 | |
| test-linux-arm64: | |
| name: Test (linux-arm64) | |
| runs-on: ubuntu-24.04-arm | |
| timeout-minutes: 300 | |
| env: | |
| CACHE_BRANCH: ${{ github.head_ref || github.ref_name }} | |
| DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} | |
| # Keep hosted Linux runners responsive during the full MuJoCo/MyoSuite test | |
| # build. The default HOST_CPUS-1 parallelism can starve the runner hard | |
| # enough for GitHub Actions to lose communication. | |
| # Match the official arm64 MuJoCo wheel's Clang 20 toolchain so contact- | |
| # heavy oracle rollouts do not diverge from GCC-generated physics code. | |
| BAZEL_CI_RESOURCE_OPTS: >- | |
| --repo_env=CC=/usr/bin/clang-20 | |
| --repo_env=CXX=/usr/bin/clang++-20 | |
| --compiler=clang | |
| --jobs=2 --local_resources=cpu=2 --local_resources=memory=HOST_RAM*.35 | |
| --experimental_disk_cache_gc_max_size=2G --experimental_disk_cache_gc_idle_delay=0s | |
| MUJOCO_GL: egl | |
| EGL_PLATFORM: surfaceless | |
| 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 3.12 | |
| uses: actions/setup-python@v7 | |
| with: | |
| python-version: "3.12" | |
| - name: Install Linux dependencies | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y clang-20 cmake lcov ninja-build swig qt6-base-dev libegl1-mesa-dev libopengl-dev | |
| python -m pip install --upgrade cmake | |
| - name: Restore Bazel caches | |
| uses: actions/cache/restore@v6 | |
| with: | |
| path: | | |
| ~/.cache/bazelisk | |
| ~/.cache/envpool-bazel-repo | |
| ~/.cache/envpool-bazel-disk | |
| key: bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.CACHE_BRANCH }} | |
| restore-keys: | | |
| bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.DEFAULT_BRANCH }}- | |
| bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}- | |
| - name: Install bazelisk | |
| run: | | |
| go install github.com/bazelbuild/bazelisk@latest | |
| echo "$HOME/go/bin" >> "$GITHUB_PATH" | |
| - name: Test | |
| run: | | |
| make BAZELOPT="--repository_cache=$HOME/.cache/envpool-bazel-repo --disk_cache=$HOME/.cache/envpool-bazel-disk $BAZEL_CI_RESOURCE_OPTS" \ | |
| BAZEL_TEST_TARGETS="//..." bazel-test | |
| - name: Shut down Bazel | |
| if: ${{ always() && !cancelled() }} | |
| continue-on-error: true | |
| run: bazelisk shutdown | |
| - name: Save Bazel caches | |
| id: save-bazel-caches | |
| if: ${{ always() && !cancelled() }} | |
| uses: actions/cache/save@v6 | |
| with: | |
| path: | | |
| ~/.cache/bazelisk | |
| ~/.cache/envpool-bazel-repo | |
| ~/.cache/envpool-bazel-disk | |
| key: bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.CACHE_BRANCH }}-${{ github.run_id }}-attempt${{ github.run_attempt }} | |
| - name: Prune older Bazel caches | |
| if: ${{ success() && (steps.save-bazel-caches.outcome == 'success' || steps.save-bazel-caches.outcome == 'skipped') }} | |
| continue-on-error: true | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: >- | |
| python scripts/prune_actions_caches.py | |
| --repo "${{ github.repository }}" | |
| --prefix "bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-" | |
| --group-by-branch | |
| --delete-missing-branches | |
| --keep 1 | |
| test-macos: | |
| name: Test (macos) | |
| runs-on: macos-14 | |
| timeout-minutes: 180 | |
| env: | |
| CACHE_BRANCH: ${{ github.head_ref || github.ref_name }} | |
| DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} | |
| BAZEL_CI_RESOURCE_OPTS: --jobs=HOST_CPUS-1 --local_resources=cpu=HOST_CPUS-1 --local_resources=memory=HOST_RAM*.5 | |
| 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 3.12 | |
| uses: actions/setup-python@v7 | |
| with: | |
| python-version: "3.12" | |
| - name: Install macOS dependencies | |
| run: | | |
| brew install ninja swig qtbase | |
| 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 | |
| sudo ln -sfn "$(brew --prefix ninja)/bin/ninja" /usr/local/bin/ninja | |
| echo "BAZEL_RULES_QT_DIR=$(brew --prefix qtbase)" >> "$GITHUB_ENV" | |
| - name: Restore Bazel caches | |
| uses: actions/cache/restore@v6 | |
| with: | |
| path: | | |
| ~/.cache/bazelisk | |
| ~/.cache/envpool-bazel-repo | |
| ~/.cache/envpool-bazel-disk | |
| key: bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.CACHE_BRANCH }} | |
| restore-keys: | | |
| bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.DEFAULT_BRANCH }}- | |
| bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}- | |
| - name: Install bazelisk | |
| run: | | |
| go install github.com/bazelbuild/bazelisk@latest | |
| echo "$HOME/go/bin" >> "$GITHUB_PATH" | |
| - name: Test | |
| run: | | |
| make BAZELOPT="--repository_cache=$HOME/.cache/envpool-bazel-repo --disk_cache=$HOME/.cache/envpool-bazel-disk $BAZEL_CI_RESOURCE_OPTS" bazel-test | |
| - name: Shut down Bazel | |
| if: ${{ always() && !cancelled() }} | |
| continue-on-error: true | |
| run: bazelisk shutdown | |
| - name: Save Bazel caches | |
| id: save-bazel-caches | |
| if: ${{ always() && !cancelled() }} | |
| uses: actions/cache/save@v6 | |
| with: | |
| path: | | |
| ~/.cache/bazelisk | |
| ~/.cache/envpool-bazel-repo | |
| ~/.cache/envpool-bazel-disk | |
| key: bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.CACHE_BRANCH }}-${{ github.run_id }}-attempt${{ github.run_attempt }} | |
| - name: Prune older Bazel caches | |
| if: ${{ success() && (steps.save-bazel-caches.outcome == 'success' || steps.save-bazel-caches.outcome == 'skipped') }} | |
| continue-on-error: true | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: >- | |
| python scripts/prune_actions_caches.py | |
| --repo "${{ github.repository }}" | |
| --prefix "bazel-test-v3-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-" | |
| --group-by-branch | |
| --delete-missing-branches | |
| --keep 1 | |
| test-windows: | |
| name: Test (windows) | |
| runs-on: windows-2022 | |
| timeout-minutes: 300 | |
| env: | |
| BAZEL_SH: C:/Program Files/Git/usr/bin/bash.exe | |
| CACHE_BRANCH: ${{ github.head_ref || github.ref_name }} | |
| DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} | |
| # MSVC ignores the POSIX -g0/-O3 flags from --config=test. Use opt mode | |
| # and a larger capped disk cache so Windows reruns are not cold builds. | |
| BAZEL_CI_RESOURCE_OPTS: --compilation_mode=opt --jobs=HOST_CPUS-1 --local_resources=cpu=HOST_CPUS-1 --local_resources=memory=HOST_RAM*.5 --experimental_disk_cache_gc_max_size=4G --experimental_disk_cache_gc_idle_delay=0s | |
| BAZEL_CACHE_PREFIX: bazel-test-v6-windows-opt-cache4g | |
| 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 | |
| - 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: Restore Bazel caches | |
| uses: actions/cache/restore@v6 | |
| with: | |
| # Keep the Windows disk cache capped. The old uncapped archive grew | |
| # past 7 GB and exhausted the hosted runner disk during extraction. | |
| path: | | |
| ~/.cache/bazelisk | |
| ~/.cache/envpool-bazel-repo | |
| ~/.cache/envpool-bazel-disk | |
| key: ${{ env.BAZEL_CACHE_PREFIX }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.CACHE_BRANCH }} | |
| restore-keys: | | |
| ${{ env.BAZEL_CACHE_PREFIX }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.DEFAULT_BRANCH }}- | |
| ${{ env.BAZEL_CACHE_PREFIX }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}- | |
| - 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 3.12 | |
| uses: actions/setup-python@v7 | |
| with: | |
| python-version: "3.12" | |
| - 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: Test | |
| shell: bash | |
| run: | | |
| repo_cache=$(cygpath -am "$HOME/.cache/envpool-bazel-repo") | |
| disk_cache=$(cygpath -am "$HOME/.cache/envpool-bazel-disk") | |
| make BAZELOPT="--repository_cache=$repo_cache --disk_cache=$disk_cache $BAZEL_CI_RESOURCE_OPTS" bazel-test | |
| - name: Shut down Bazel | |
| if: ${{ always() && !cancelled() }} | |
| continue-on-error: true | |
| shell: bash | |
| run: bazelisk shutdown | |
| - name: Save Bazel caches | |
| id: save-bazel-caches | |
| if: ${{ always() && !cancelled() }} | |
| uses: actions/cache/save@v6 | |
| with: | |
| path: | | |
| ~/.cache/bazelisk | |
| ~/.cache/envpool-bazel-repo | |
| ~/.cache/envpool-bazel-disk | |
| key: ${{ env.BAZEL_CACHE_PREFIX }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-${{ env.CACHE_BRANCH }}-${{ github.run_id }}-attempt${{ github.run_attempt }} | |
| - name: Prune older Bazel caches | |
| if: ${{ success() && (steps.save-bazel-caches.outcome == 'success' || steps.save-bazel-caches.outcome == 'skipped') }} | |
| continue-on-error: true | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: >- | |
| python scripts/prune_actions_caches.py | |
| --repo "${{ github.repository }}" | |
| --prefix "${{ env.BAZEL_CACHE_PREFIX }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('.bazelversion') }}-" | |
| --group-by-branch | |
| --delete-missing-branches | |
| --keep 1 | |
| deploy-coverage-pages: | |
| name: Deploy coverage page | |
| if: ${{ github.event_name == 'push' }} | |
| runs-on: ubuntu-24.04 | |
| needs: | |
| - test-linux-x64 | |
| permissions: | |
| contents: read | |
| pages: write | |
| id-token: write | |
| environment: | |
| name: github-pages | |
| url: ${{ steps.deployment.outputs.page_url }} | |
| steps: | |
| - name: Deploy GitHub Pages | |
| id: deployment | |
| uses: actions/deploy-pages@v5 |