Skip to content

CI

CI #13354

Workflow file for this run

name: CI
on:
push:
branches:
- main
pull_request:
types: [opened, labeled, synchronize, reopened]
merge_group:
concurrency:
group: ${{ github.head_ref || github.run_id }}
cancel-in-progress: ${{ github.head_ref != 'main' }}
env:
# TODO(#1915): Use stable toolchain once stwo is stable.
RUST_NIGHTLY_TOOLCHAIN: "nightly-2025-02-13"
jobs:
setup-matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- id: set-matrix
shell: python
run: |
import json
import os
event_name = "${{ github.event_name }}"
ref = "${{ github.ref }}"
is_labeled = "${{ contains(github.event.pull_request.labels.*.name, 'test-windows') }}"
is_labeled = is_labeled == 'true'
print('is_labeled', is_labeled)
# Build matrix with platforms
matrix = {"platform": []}
# Always include Linux
matrix["platform"].append({
"name": "linux x86-64",
"os": "ubuntu-latest"
})
is_pushed_to_main = event_name == "push" and ref == "refs/heads/main"
print('is_pushed_to_main', is_pushed_to_main)
# Include Windows only for pushes to main branch or explicitly labeled PRs
if is_pushed_to_main or is_labeled:
matrix["platform"].append({
"name": "windows x86-64",
"os": "windows-latest"
})
# Output the matrix as JSON
with open(os.environ["GITHUB_OUTPUT"], "a") as f:
f.write(f"matrix={json.dumps(matrix)}\n")
build-test:
name: build test ${{ matrix.platform.name }}
runs-on: ${{ matrix.platform.os }}
needs: setup-matrix
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.setup-matrix.outputs.matrix) }}
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@v2
with:
tool: [email protected]
- name: nextest archive
run: cargo nextest archive --workspace --all-features --cargo-profile ci --archive-file 'nextest-archive-${{ matrix.platform.os }}.tar.zst' --exclude scarb-prove --exclude scarb-verify --exclude cairo-lang-macro
- uses: actions/upload-artifact@v5
with:
name: nextest-archive-${{ matrix.platform.os }}
path: nextest-archive-${{ matrix.platform.os }}.tar.zst
test:
name: test ${{ matrix.platform.name }} ${{ matrix.partition }}/4
runs-on: ${{ matrix.platform.os }}
needs:
- setup-matrix
- build-test
strategy:
fail-fast: false
matrix:
platform: ${{ fromJSON(needs.setup-matrix.outputs.matrix).platform }}
partition: [ 1, 2, 3, 4 ]
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@v2
with:
tool: [email protected]
- uses: actions/download-artifact@v6
with:
name: nextest-archive-${{ matrix.platform.os }}
- name: nextest partition ${{ matrix.partition }}/4
run: cargo nextest run --partition 'count:${{ matrix.partition }}/4' --archive-file 'nextest-archive-${{ matrix.platform.os }}.tar.zst'
test-doc:
name: doc tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: run tests
run: cargo test --doc
scarb-metadata-compatibility:
name: scarb-metadata compatibility check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: software-mansion/setup-scarb@v1
with:
cache: false
scarb-version: "2.3.0"
- run: echo "SCARB_TEST_BIN=$(which scarb)" >> $GITHUB_ENV
- name: run tests
run: cargo test -p scarb-metadata
build-nightly-test:
name: build nightly test ${{ matrix.platform.name }}
runs-on: ${{ matrix.platform.os }}
strategy:
fail-fast: false
matrix:
platform:
# TODO: Enable tests on windows when stwo supports it.
- name: linux x86-64
os: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_NIGHTLY_TOOLCHAIN }}
- uses: taiki-e/install-action@v2
with:
tool: [email protected]
- uses: Swatinem/rust-cache@v2
- name: nextest archive
run: cargo nextest archive --all-features --cargo-profile ci --archive-file 'nextest-nightly-archive-${{ matrix.platform.os }}.tar.zst' --package scarb-prove --package scarb-verify
- uses: actions/upload-artifact@v5
with:
name: nextest-nightly-archive-${{ matrix.platform.os }}
path: nextest-nightly-archive-${{ matrix.platform.os }}.tar.zst
test-nightly:
name: test nightly ${{ matrix.platform.name }}
runs-on: ${{ matrix.platform.os }}
needs:
- build-test
- build-nightly-test
strategy:
fail-fast: false
matrix:
platform:
- name: linux x86-64
os: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_NIGHTLY_TOOLCHAIN }}
- uses: taiki-e/install-action@v2
with:
tool: [email protected]
- uses: Swatinem/rust-cache@v2
- name: Download stable build artifacts
uses: actions/download-artifact@v6
with:
name: nextest-archive-${{ matrix.platform.os }}
- name: Unpack build stable rust artifacts from nextest archive on linux
if: matrix.platform.os == 'ubuntu-latest'
run: |
tar --use-compress-program=unzstd -xvf nextest-archive-ubuntu-latest.tar.zst
mv target stable-crates-target
echo "NEXTEST_BIN_EXE_scarb=$GITHUB_WORKSPACE/stable-crates-target/ci/scarb" >> $GITHUB_ENV
echo "$GITHUB_WORKSPACE/stable-crates-target/ci" >> $GITHUB_PATH
echo "$GITHUB_WORKSPACE/target/ci" >> $GITHUB_PATH
- name: Download nightly build artifacts
uses: actions/download-artifact@v6
with:
name: nextest-nightly-archive-${{ matrix.platform.os }}
- name: nextest partition
run: cargo nextest run --archive-file 'nextest-nightly-archive-${{ matrix.platform.os }}.tar.zst' --extract-to ./
test-cairo-lang-macro:
name: test cairo-lang-macro ${{ matrix.platform.name }}
runs-on: ${{ matrix.platform.os }}
needs: setup-matrix
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.setup-matrix.outputs.matrix) }}
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Run tests
# Note tests depending on trybuild crate cannot be run with nextest,
# as they require access to cargo build cache of the package,
# which is not archived with nextest-archive.
run: cargo test -p cairo-lang-macro --all-features
check-rust:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- run: cargo fmt --check
# TODO(#1915): Build all crates with stable toolchain once stwo is stable.
- run: cargo clippy --all-targets --all-features --workspace --exclude scarb-prove --exclude scarb-verify -- --no-deps
env:
# Make sure CI fails on all warnings, including Clippy lints.
RUSTFLAGS: "-Dwarnings"
- run: cargo doc --all-features --no-deps --workspace --exclude scarb-prove --exclude scarb-verify
env:
# Make sure CI fails on all warnings, including Clippy lints.
RUSTDOCFLAGS: "-Dwarnings"
detect-unused-dependencies:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Machete
uses: bnjbvr/[email protected]
check-rust-nightly:
name: check-rust (nightly)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_NIGHTLY_TOOLCHAIN }}
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- run: cargo +${{ env.RUST_NIGHTLY_TOOLCHAIN }} clippy --all-targets --all-features -p scarb-prove -p scarb-verify -- --no-deps
env:
# Make sure CI fails on all warnings, including Clippy lints.
RUSTFLAGS: "-Dwarnings"
- run: cargo +${{ env.RUST_NIGHTLY_TOOLCHAIN }} doc --all-features --no-deps -p scarb-prove -p scarb-verify
env:
# Make sure CI fails on all warnings, including Clippy lints.
RUSTDOCFLAGS: "-Dwarnings"
check-website:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./website
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: '18.x'
cache: npm
cache-dependency-path: website/package-lock.json
- run: npm ci
- run: npm run fmt:check
- run: npm run build
env:
GITHUB_TOKEN: ${{ secrets.SCARB_GITHUB_PUBLIC_API_TOKEN }}
snforge-init:
runs-on: ubuntu-latest
needs:
- build-test
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@v2
with:
tool: [email protected]
- uses: actions/download-artifact@v6
with:
name: nextest-archive-ubuntu-latest
- uses: foundry-rs/setup-snfoundry@v4
- run: cargo nextest run --archive-file 'nextest-archive-ubuntu-latest.tar.zst' --run-ignored=all --filterset 'test(new_simple)'