Add multi-stage logic to docker to slim down images #446
Workflow file for this run
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: CI on Linux | |
| on: | |
| # Trigger builds on pull requests | |
| pull_request: | |
| paths-ignore: | |
| - "**.md" | |
| # Trigger builds AND tests on push to main | |
| push: | |
| branches: | |
| - main | |
| paths-ignore: | |
| - "**.md" | |
| # Add manual trigger via Actions UI for running BOTH build and test | |
| workflow_dispatch: | |
| env: | |
| RUST_LOG: info | |
| RUST_BACKTRACE: 1 | |
| jobs: | |
| build: | |
| name: Build / ${{ matrix.variance.name }} | |
| runs-on: ${{ matrix.variance.runner }} | |
| container: | |
| image: ${{ matrix.variance.image }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| variance: | |
| # - name: Ubuntu-22.04/CUDA-11.8.0 | |
| # image: "ghcr.io/rust-gpu/rust-cuda-ubuntu22-cuda11:latest" | |
| # runner: ubuntu-latest | |
| - name: Ubuntu-22.04 / CUDA-12.8.1 / x86_64 | |
| image: "ghcr.io/rust-gpu/rust-cuda-ubuntu22-cuda12:latest" | |
| runner: ubuntu-latest | |
| - name: Ubuntu-22.04 / CUDA-12.8.1 / ARM64 | |
| image: "ghcr.io/rust-gpu/rust-cuda-ubuntu22-cuda12:latest" | |
| runner: ubuntu-22.04-arm | |
| - name: Ubuntu-24.04 / CUDA-12.8.1 / x86_64 | |
| image: "ghcr.io/rust-gpu/rust-cuda-ubuntu24-cuda12:latest" | |
| runner: ubuntu-latest | |
| - name: Ubuntu-24.04 / CUDA-12.8.1 / ARM64 | |
| image: "ghcr.io/rust-gpu/rust-cuda-ubuntu24-cuda12:latest" | |
| runner: ubuntu-24.04-arm | |
| - name: RockyLinux-9 / CUDA-12.8.1 / x86_64 | |
| image: "ghcr.io/rust-gpu/rust-cuda-rockylinux9-cuda12:latest" | |
| runner: ubuntu-latest | |
| outputs: | |
| # Output the result of the permission check | |
| actor_has_write_permission: ${{ steps.check_access.outputs.require-result }} | |
| # Output the build artifact details so the test job can use them | |
| artifact_name: ${{ steps.artifact_details.outputs.name }} | |
| artifact_path: ${{ steps.artifact_details.outputs.path }} | |
| steps: | |
| - name: Free up space | |
| run: | | |
| df -h | |
| # Remove Java | |
| sudo rm -rf /usr/lib/jvm | |
| # Remove .NET | |
| sudo rm -rf /usr/share/dotnet | |
| # Remove Swift | |
| sudo rm -rf /usr/share/swift | |
| # Remove Haskell | |
| sudo rm -rf /usr/local/.ghcup | |
| # Remove Julia | |
| sudo rm -rf /usr/local/julia* | |
| # Remove Android SDKs | |
| sudo rm -rf /usr/local/lib/android | |
| # Remove Chromium | |
| sudo rm -rf /usr/local/share/chromium | |
| # Remove Microsoft/Edge and Google Chrome builds | |
| sudo rm -rf /opt/microsoft /opt/google | |
| # Remove Azure CLI | |
| sudo rm -rf /opt/az | |
| # Remove PowerShell | |
| sudo rm -rf /usr/local/share/powershell | |
| # Remove CodeQL and other toolcaches | |
| sudo rm -rf /opt/hostedtoolcache | |
| docker system prune -af || true | |
| docker builder prune -af || true | |
| df -h | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Check access permissions | |
| id: check_access | |
| uses: actions-cool/check-user-permission@v2 | |
| with: | |
| require: write | |
| username: ${{ github.triggering_actor }} | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Verify CUDA, Rust installation | |
| run: | | |
| nvcc --version | |
| rustup show | |
| - name: Rustfmt | |
| run: cargo fmt --all -- --check | |
| - name: Build all bindings | |
| run: cargo build --all-features -p cust_raw | |
| - name: Build workspace | |
| run: cargo build --workspace --exclude "optix*" --exclude "path-tracer" --exclude "denoiser" --exclude "ex0*" --exclude "cudnn*" | |
| - name: Clippy | |
| env: | |
| RUSTFLAGS: -Dwarnings | |
| run: cargo clippy --workspace --exclude "optix*" --exclude "path-tracer" --exclude "denoiser" --exclude "ex0*" --exclude "cudnn*" | |
| # Don't currently test because many tests rely on the system having a CUDA GPU | |
| # - name: Test | |
| # run: cargo test --workspace | |
| - name: Check documentation | |
| env: | |
| RUSTDOCFLAGS: -Dwarnings | |
| run: cargo doc --workspace --all-features --document-private-items --no-deps --exclude "optix*" --exclude "path-tracer" --exclude "denoiser" --exclude "ex0*" --exclude "cudnn*" --exclude "cust_raw" | |
| - name: Prepare artifact details | |
| id: artifact_details | |
| run: | | |
| SANITIZED_NAME=$(echo '${{ matrix.variance.name }}' | sed 's/[^a-zA-Z0-9.-]/-/g') | |
| ARTIFACT_NAME="target_debug-${SANITIZED_NAME}-${{ github.run_id }}" | |
| ARTIFACT_PATH="target/debug" | |
| echo "name=${ARTIFACT_NAME}" >> $GITHUB_OUTPUT | |
| echo "path=${ARTIFACT_PATH}" >> $GITHUB_OUTPUT | |
| - name: Upload build artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ steps.artifact_details.outputs.name }} | |
| path: ${{ steps.artifact_details.outputs.path }} | |
| retention-days: 1 | |
| test: | |
| name: Test / ${{ matrix.variance.name }} | |
| # Depends on the build job | |
| needs: build | |
| # Run ONLY IF: | |
| # - The corresponding 'build' job succeeded AND | |
| # - EITHER: | |
| # - Event is 'push' to 'main' | |
| # - OR Event is 'workflow_dispatch' | |
| # - OR Event is 'pull_request' AND the 'actor_has_write_permission' output from build is 'true' | |
| if: > | |
| needs.build.result == 'success' && | |
| ( | |
| (github.event_name == 'push' && github.ref == 'refs/heads/main') || | |
| github.event_name == 'workflow_dispatch' || | |
| (github.event_name == 'pull_request' && needs.build.outputs.actor_has_write_permission == 'true') | |
| ) | |
| runs-on: ${{ matrix.variance.runner }} | |
| # Use the exact same container image as the build job | |
| container: | |
| image: ${{ matrix.variance.image }} | |
| strategy: | |
| # Save some credits | |
| fail-fast: true | |
| matrix: | |
| variance: | |
| # Must match the build job's matrix definition | |
| # - name: Ubuntu-22.04 / CUDA-11.8.0 | |
| # image: "ghcr.io/rust-gpu/rust-cuda-ubuntu22-cuda11:latest" | |
| # runner: ubuntu-latest | |
| - name: Ubuntu-22.04 / CUDA-12.8.1 / x86_64 | |
| image: "ghcr.io/rust-gpu/rust-cuda-ubuntu22-cuda12:latest" | |
| runner: ubuntu-latest | |
| - name: Ubuntu-22.04 / CUDA-12.8.1 / ARM64 | |
| image: "ghcr.io/rust-gpu/rust-cuda-ubuntu22-cuda12:latest" | |
| runner: ubuntu-22.04-arm | |
| - name: Ubuntu-24.04 / CUDA-12.8.1 / x86_64 | |
| image: "ghcr.io/rust-gpu/rust-cuda-ubuntu24-cuda12:latest" | |
| runner: ubuntu-latest | |
| - name: Ubuntu-24.04 / CUDA-12.8.1 / ARM64 | |
| image: "ghcr.io/rust-gpu/rust-cuda-ubuntu24-cuda12:latest" | |
| runner: ubuntu-24.04-arm | |
| - name: RockyLinux-9 / CUDA-12.8.1 / x86_64 | |
| image: "ghcr.io/rust-gpu/rust-cuda-rockylinux9-cuda12:latest" | |
| runner: ubuntu-latest | |
| steps: | |
| - name: Download build artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: ${{ needs.build.outputs.artifact_name }} | |
| path: ${{ needs.build.outputs.artifact_path }} | |
| - name: List downloaded files | |
| run: ls -lR ${{ needs.build.outputs.artifact_path }} | |
| - name: Run remote tests | |
| env: | |
| MODAL_TOKEN_ID: ${{ secrets.MODAL_TOKEN_ID }} | |
| MODAL_TOKEN_SECRET: ${{ secrets.MODAL_TOKEN_SECRET }} | |
| run: | | |
| echo "Stubbed out" | |
| compiletest: | |
| name: Compile tests | |
| runs-on: ubuntu-latest | |
| container: | |
| image: "ghcr.io/rust-gpu/rust-cuda-ubuntu24-cuda12:latest" | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Run cargo version | |
| run: cargo --version | |
| - name: Rustfmt compiletests | |
| shell: bash | |
| run: shopt -s globstar && rustfmt --check tests/compiletests/ui/**/*.rs | |
| - name: Compiletest | |
| run: cargo run -p compiletests --release --no-default-features -- --target-arch compute_61,compute_70,compute_90 |