name: CI on: workflow_dispatch: pull_request: types: [opened, synchronize] paths-ignore: - '**/*.md' - '**/*.yml' - '!.github/workflows/ci.yml' - '!.github/actions/clone-submodules/action.yml' push: branches: - main - "renovate/**" paths-ignore: - '**/*.md' - '**/*.yml' - '!.github/workflows/ci.yml' - '!.github/actions/clone-submodules/action.yml' concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: ${{ github.ref_name != 'main' }} env: CARGO_INCREMENTAL: 0 RUSTFLAGS: "-D warnings" jobs: optimize_ci: name: Graphite Optimize CI runs-on: ubuntu-latest outputs: skip: ${{ steps.check_skip.outputs.skip }} steps: - uses: withgraphite/graphite-ci-action@main id: check_skip with: graphite_token: ${{ secrets.GRAPHITE_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }} test: needs: optimize_ci if: needs.optimize_ci.outputs.skip == 'false' name: Test strategy: fail-fast: false matrix: include: # - os: windows-latest # See `test-windows` job below - os: ubuntu-latest - os: macos-14 runs-on: ${{ matrix.os }} env: # https://github.com/mozilla/sccache/blob/main/docs/S3.md AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} SCCACHE_BUCKET: ${{ secrets.SCCACHE_BUCKET }} SCCACHE_ENDPOINT: ${{ secrets.SCCACHE_ENDPOINT }} SCCACHE_REGION: auto RUSTC_WRAPPER: ${{ vars.USE_SCCACHE == 'true' && 'sccache' || '' }} CARGO_INCREMENTAL: 0 SCCACHE_LOCAL_RW_MODE: steps: - uses: taiki-e/checkout-action@v1 - uses: Boshen/setup-rust@main with: # warm cache factory for all other CI jobs # cache `target` directory to avoid download crates save-cache: ${{ github.ref_name == 'main' }} cache-key: warm # cache build outputs to speed up compilation - uses: mozilla-actions/sccache-action@v0.0.5 if: ${{ vars.USE_SCCACHE == 'true' }} - run: cargo ck - run: cargo test --no-run - run: cargo test test-windows: needs: optimize_ci if: needs.optimize_ci.outputs.skip == 'false' name: Test (windows-latest) runs-on: windows-latest steps: - uses: taiki-e/checkout-action@v1 # Unsung heros of the internet, who led me here to speed up window's slowness: # https://github.com/actions/cache/issues/752#issuecomment-1847036770 # https://github.com/astral-sh/uv/blob/502e04200d52de30d3159894833b3db4f0d6644d/.github/workflows/ci.yml#L158 - uses: samypr100/setup-dev-drive@v3 with: workspace-copy: true drive-size: 8GB - name: Install Rust working-directory: ${{ env.DEV_DRIVE_WORKSPACE }} env: CARGO_HOME: ${{ env.DEV_DRIVE }}/.cargo RUSTUP_HOME: ${{ env.DEV_DRIVE }}/.rustup shell: bash run: | sed -i -e 's/profile = "default"/profile = "minimal"/g' rust-toolchain.toml rustup set profile minimal rustup show git restore . - uses: Swatinem/rust-cache@v2 with: workspaces: ${{ env.DEV_DRIVE_WORKSPACE }} save-if: ${{ github.ref_name == 'main' }} shared-key: windows-latest env: CARGO_HOME: ${{ env.DEV_DRIVE }}/.cargo RUSTUP_HOME: ${{ env.DEV_DRIVE }}/.rustup - name: Run working-directory: ${{ env.DEV_DRIVE_WORKSPACE }} env: CARGO_HOME: ${{ env.DEV_DRIVE }}/.cargo RUSTUP_HOME: ${{ env.DEV_DRIVE }}/.rustup shell: bash run: | cargo test --no-run cargo test cargo ck wasm: needs: optimize_ci if: needs.optimize_ci.outputs.skip == 'false' name: Check Wasm runs-on: ubuntu-latest steps: - uses: taiki-e/checkout-action@v1 - uses: Boshen/setup-rust@main with: cache-key: wasm save-cache: ${{ github.ref_name == 'main' }} - name: Check run: | rustup target add wasm32-unknown-unknown cargo check -p oxc_wasm --target wasm32-unknown-unknown - name: Build run: | npx -y wasm-pack build --target web --dev ./crates/oxc_wasm npx -y wasm-pack build --target web --dev ./wasm/parser - name: Setup Node.js uses: actions/setup-node@v4 with: node-version-file: .node-version - name: Check output types run: npx -y -p typescript tsc --lib es2020,dom crates/oxc_wasm/pkg/oxc_wasm.d.ts typos: needs: optimize_ci if: needs.optimize_ci.outputs.skip == 'false' name: Spell Check runs-on: ubuntu-latest steps: - uses: taiki-e/checkout-action@v1 - uses: crate-ci/typos@v1.22.9 with: files: . deny: needs: optimize_ci if: needs.optimize_ci.outputs.skip == 'false' name: Cargo Deny runs-on: ubuntu-latest steps: - uses: taiki-e/checkout-action@v1 - uses: dorny/paths-filter@v3 id: filter with: filters: | src: - 'Cargo.lock' - uses: Boshen/setup-rust@main if: steps.filter.outputs.src == 'true' with: restore-cache: false tools: cargo-deny - if: steps.filter.outputs.src == 'true' run: cargo deny check unused-deps: needs: optimize_ci if: needs.optimize_ci.outputs.skip == 'false' name: Check Unused Dependencies runs-on: ubuntu-latest steps: - uses: taiki-e/checkout-action@v1 - uses: dorny/paths-filter@v3 id: filter with: filters: | src: - '**/*.rs' - '**/Cargo.toml' - 'Cargo.lock' - uses: Boshen/setup-rust@main with: restore-cache: false if: steps.filter.outputs.src == 'true' - uses: cargo-bins/cargo-binstall@main if: steps.filter.outputs.src == 'true' - run: cargo binstall --no-confirm cargo-shear if: steps.filter.outputs.src == 'true' - run: cargo shear if: steps.filter.outputs.src == 'true' format: needs: optimize_ci if: needs.optimize_ci.outputs.skip == 'false' name: Format runs-on: ubuntu-latest steps: - uses: taiki-e/checkout-action@v1 - uses: Boshen/setup-rust@main with: components: rustfmt restore-cache: false - run: cargo fmt --all -- --check lint: needs: optimize_ci if: needs.optimize_ci.outputs.skip == 'false' name: Clippy runs-on: ubuntu-latest steps: - uses: taiki-e/checkout-action@v1 - uses: Boshen/setup-rust@main with: cache-key: warm components: clippy - run: cargo lint -- -D warnings doc: needs: optimize_ci if: needs.optimize_ci.outputs.skip == 'false' name: Doc runs-on: ubuntu-latest steps: - uses: taiki-e/checkout-action@v1 - uses: Boshen/setup-rust@main with: cache-key: warm components: rust-docs - run: RUSTDOCFLAGS='-D warnings' cargo doc --no-deps --document-private-items conformance: needs: optimize_ci if: needs.optimize_ci.outputs.skip == 'false' name: Conformance runs-on: ubuntu-latest env: # https://github.com/mozilla/sccache/blob/main/docs/S3.md AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} SCCACHE_BUCKET: ${{ secrets.SCCACHE_BUCKET }} SCCACHE_ENDPOINT: ${{ secrets.SCCACHE_ENDPOINT }} SCCACHE_REGION: auto RUSTC_WRAPPER: ${{ vars.USE_SCCACHE == 'true' && 'sccache' || '' }} CARGO_INCREMENTAL: 0 steps: - uses: taiki-e/checkout-action@v1 - uses: dorny/paths-filter@v3 id: filter with: filters: | src: - '!crates/oxc_linter/**' - uses: Boshen/setup-rust@main if: steps.filter.outputs.src == 'true' with: cache-key: conformance save-cache: ${{ github.ref_name == 'main' }} tools: just - uses: mozilla-actions/sccache-action@v0.0.5 - name: Clone submodules if: steps.filter.outputs.src == 'true' uses: ./.github/actions/clone-submodules - name: Set up Bun if: steps.filter.outputs.src == 'true' uses: oven-sh/setup-bun@v2 - name: Install Node.js if: steps.filter.outputs.src == 'true' uses: actions/setup-node@v4 with: node-version-file: .node-version registry-url: 'https://registry.npmjs.org' - name: Check Conformance if: steps.filter.outputs.src == 'true' run: | just coverage git diff --exit-code