# Whenever an open PR is updated, the workflow will be triggered # # This can get expensive, so we do a lot of caching and checks to prevent unnecessary runs name: Rust CI on: push: branches: - main paths: - packages/** - examples/** - docs/guide/** - src/** - .github/** - lib.rs - Cargo.toml - Makefile.toml pull_request: types: [opened, synchronize, reopened, ready_for_review] branches: - main paths: - packages/** - examples/** - src/** - .github/** - lib.rs - Cargo.toml # workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true env: CARGO_TERM_COLOR: always CARGO_INCREMENTAL: "0" jobs: check: if: github.event.pull_request.draft == false name: Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: sudo apt-get update - run: sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev libxdo-dev - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: cache-all-crates: "true" save-if: ${{ github.ref == 'refs/heads/main' }} - run: cargo check --all --examples --tests --all-features --all-targets check-msrv: if: github.event.pull_request.draft == false name: Check MSRV runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: cache-all-crates: "true" save-if: ${{ github.ref == 'refs/heads/main' }} # https://github.com/foresterre/cargo-msrv/blob/4345edfe3f4fc91cc8ae6c7d6804c0748fae92ae/.github/workflows/msrv.yml - name: install_cargo_msrv run: cargo install cargo-msrv --all-features - name: version_of_cargo_msrv run: cargo msrv --version - name: run_cargo_msrv run: cargo msrv --output-format json verify -- cargo check - name: run_cargo_msrv_on_verify_failure if: ${{ failure() }} run: cargo msrv --output-format json -- cargo check test: if: github.event.pull_request.draft == false name: Test Suite runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@v1.3.1 with: # speed things up a bit large-packages: false docker-images: false swap-storage: false - run: sudo apt-get update - run: sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev libxdo-dev - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: cache-all-crates: "true" save-if: ${{ github.ref == 'refs/heads/main' }} - uses: davidB/rust-cargo-make@v1 - uses: browser-actions/setup-firefox@latest - uses: jetli/wasm-pack-action@v0.4.0 - run: cargo make tests release-test: if: github.event.pull_request.draft == false name: Test Suite with Optimizations runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@v1.3.1 with: # speed things up a bit large-packages: false docker-images: false swap-storage: false - run: sudo apt-get update - run: sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev libxdo-dev - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 with: cache-all-crates: "true" save-if: ${{ github.ref == 'refs/heads/main' }} - uses: davidB/rust-cargo-make@v1 - uses: browser-actions/setup-firefox@latest - uses: jetli/wasm-pack-action@v0.4.0 - run: cargo test --profile release-unoptimized --lib --bins --tests --examples --workspace --exclude dioxus-desktop --exclude dioxus-mobile fmt: if: github.event.pull_request.draft == false name: Rustfmt runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: components: rustfmt - uses: Swatinem/rust-cache@v2 with: cache-all-crates: "true" save-if: ${{ github.ref == 'refs/heads/main' }} - run: cargo fmt --all -- --check typos: if: github.event.pull_request.draft == false name: Check for typos runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Check for typos uses: crate-ci/typos@master clippy: if: github.event.pull_request.draft == false name: Clippy runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: sudo apt-get update - run: sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev - uses: dtolnay/rust-toolchain@stable with: components: rustfmt, clippy - uses: Swatinem/rust-cache@v2 with: cache-all-crates: "true" save-if: ${{ github.ref == 'refs/heads/main' }} - run: cargo clippy --workspace --examples --tests --all-features --all-targets -- -D warnings # Only run semver checks if the PR is not a draft and does not have the breaking label # Breaking PRs don't need to follow semver since they are breaking changes # However, this means we won't attempt to backport them, so you should be careful about using this label, as it will # likely make future backporting difficult # # todo: fix this so even if breaking changes have been merged, the fix can be backported # # This will stop working once the first breaking change has been merged, so we should really try to just backport the fix # and *then* run the semver checks. Basically "would backporting this PR cause a breaking change on stable?" # # semver: # if: github.event.pull_request.draft == false && !contains(github.event.pull_request.labels.*.name, 'breaking') # name: Semver Check # runs-on: ubuntu-latest # steps: # - uses: actions/checkout@v4 # - uses: dtolnay/rust-toolchain@stable # - uses: Swatinem/rust-cache@v2 # with: # cache-all-crates: "true" # save-if: ${{ github.ref == 'refs/heads/main' }} # - name: Check semver # uses: obi1kenobi/cargo-semver-checks-action@v2 # with: # manifest-path: ./Cargo.toml # exclude: "dioxus-cli, dioxus-ext" playwright: if: github.event.pull_request.draft == false name: Playwright Tests runs-on: ubuntu-latest steps: # Do our best to cache the toolchain and node install steps - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 16 - name: Free Disk Space (Ubuntu) uses: jlumbroso/free-disk-space@v1.3.1 with: # speed things up a bit large-packages: false docker-images: false swap-storage: false - name: Install Rust uses: dtolnay/rust-toolchain@master with: toolchain: stable targets: x86_64-unknown-linux-gnu,wasm32-unknown-unknown - uses: Swatinem/rust-cache@v2 with: cache-all-crates: "true" save-if: ${{ github.ref == 'refs/heads/main' }} - name: Install dependencies run: npm ci working-directory: ./packages/playwright-tests - name: Install Playwright run: npm install -D @playwright/test working-directory: ./packages/playwright-tests - name: Install Playwright Browsers run: npx playwright install --with-deps working-directory: ./packages/playwright-tests - name: Run Playwright tests run: npx playwright test working-directory: ./packages/playwright-tests - uses: actions/upload-artifact@v4 if: always() with: name: playwright-report path: playwright-report/ retention-days: 30 matrix_test: runs-on: ${{ matrix.platform.os }} if: github.event.pull_request.draft == false env: RUST_CARGO_COMMAND: ${{ matrix.platform.cross == true && 'cross' || 'cargo' }} strategy: matrix: platform: - { target: x86_64-pc-windows-msvc, os: windows-latest, toolchain: "1.79.0", cross: false, command: "test", args: "--all --tests", } - { target: aarch64-apple-darwin, os: macos-latest, toolchain: "1.79.0", cross: false, command: "test", args: "--all --tests", } - { target: x86_64-apple-darwin, os: macos-13, toolchain: "1.79.0", cross: false, command: "test", args: "--all --tests", } - { target: aarch64-apple-ios, os: macos-latest, toolchain: "1.79.0", cross: false, command: "build", args: "--package dioxus-mobile", } - { target: aarch64-linux-android, os: ubuntu-latest, toolchain: "1.79.0", cross: true, command: "build", args: "--package dioxus-mobile", } steps: - uses: actions/checkout@v4 - name: Free Disk Space (Ubuntu) if: ${{ matrix.platform.os == 'ubuntu-latest' }} uses: jlumbroso/free-disk-space@v1.3.1 with: # speed things up a bit large-packages: false docker-images: false swap-storage: false - name: install stable uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.platform.toolchain }} targets: ${{ matrix.platform.target }} components: rustfmt - name: Install nasm for windows (tls) if: ${{ matrix.platform.target == 'x86_64-pc-windows-msvc' }} uses: ilammy/setup-nasm@v1 - name: Install cross if: ${{ matrix.platform.cross == true }} uses: taiki-e/install-action@cross - uses: Swatinem/rust-cache@v2 with: key: "${{ matrix.platform.target }}" cache-all-crates: "true" save-if: ${{ github.ref == 'refs/heads/main' }} - name: test run: | ${{ env.RUST_CARGO_COMMAND }} ${{ matrix.platform.command }} ${{ matrix.platform.args }} --target ${{ matrix.platform.target }}