Skip to content

Improve CI setup + other fixes #639

Improve CI setup + other fixes

Improve CI setup + other fixes #639

Workflow file for this run

name: Rust
# Contains checks:
# - That the code compiles
# - That the code complies with formatting
# - Lints (using clippy) to find errors
# - That crates that are published are publish-able (works most of the time)
# - Testing
# - Standard Rust integration and unit tests
# - Fuzz tests (parser and checker)
# - WASM edition works tests
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
CACHE_PATHS: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
checker/fuzz/target
parser/fuzz/target
jobs:
validity:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_PATHS }}
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Check source is valid
run: cargo check --workspace
- name: Check binary
run: cargo check --bin ezno
formating:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Check Rust formatting with rustfmt
run: cargo fmt --all --check
- uses: brndnmtthws/rust-action-cargo-binstall@v1
with:
packages: taplo-cli
- name: Check TOML formatting with taplo
run: taplo fmt --check **/*/Cargo.toml
tests:
needs: validity
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_PATHS }}
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- uses: dorny/paths-filter@v3
id: changes
with:
filters: |
parser:
- 'parser/**'
checker:
- 'checker/**'
- name: Run parser tests
if: steps.changes.outputs.parser == 'true' || github.ref_name == 'main'
run: |
cargo test
# TODO more
curl https://esm.sh/v128/[email protected]/es2022/react-dom.mjs > react.js
cargo run -p ezno-parser --example parse react.js
working-directory: parser
- name: Run checker specification
if: (steps.changes.outputs.checker == 'true' && github.event_name != 'pull_request') || github.ref_name == 'main'
run: cargo test
- name: Run checker specification (w/ staging)
if: steps.changes.outputs.checker == 'true' && github.event_name == 'pull_request'
run: cargo test -F staging -p ezno-checker-specification
env:
EZNO_DEBUG: 1
- name: Run checker specification (just to implement)
continue-on-error: true
if: steps.changes.outputs.checker == 'true' && github.event_name == 'pull_request'
run: |
# Aim of this test is to catch anything that may have been fixed in this next commit or any bad regressions (stack overflows)
cargo test --no-default-features -F to_implement -p ezno-checker-specification
env:
EZNO_DEBUG: 1
- name: Run checker tests
if: steps.changes.outputs.checker == 'true' || github.ref_name == 'main'
run: |
# Test checker with the parser features
cargo test -F ezno-parser -p ezno-checker
- name: Run CLI and base tests
run: cargo test
extras:
runs-on: ubuntu-latest
needs: validity
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_PATHS }}
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- uses: dorny/paths-filter@v3
id: changes
with:
filters: |
src:
- 'src/**'
parser:
- 'parser/**'
checker:
- 'checker/**'
- uses: denoland/setup-deno@v1
if: steps.changes.outputs.src == 'true' || github.ref_name == 'main'
with:
deno-version: v1.x
- uses: actions/setup-node@v4
if: steps.changes.outputs.src == 'true' || github.ref_name == 'main'
with:
node-version: 18
- name: Check parser without extras
if: steps.changes.outputs.parser == 'true'
# TODO want `continue-on-error: true` but doesn't report error
run:
cargo check -p ezno-parser --no-default-features
- name: Check parser generator
if: steps.changes.outputs.parser == 'true'
# TODO want `continue-on-error: true` but doesn't report error
run:
cargo test -p ezno-ast-generator
- name: Check checker without default features
if: steps.changes.outputs.checker == 'true'
# TODO want `continue-on-error: true` but doesn't report error
run:
cargo check -p ezno-checker --no-default-features
- name: Build and test WASM
if: steps.changes.outputs.src == 'true' || github.ref_name == 'main'
run: |
# TODO `cargo check --target wasm32-unknown-unknown --lib` might be good enough
rustup target add wasm32-unknown-unknown
npm ci
npm run build
npm run run-tests
node ./dist/cli.cjs info
deno run -A ./dist/cli.mjs info
npx -p typescript tsc --strict --pretty ./build/ezno_lib.d.ts
echo "debug checked with TSC"
cargo run -p ezno-parser --example parse ./build/ezno_lib.d.ts --type-definition-module
# TODO temp as the types generated can be a bit unpredicatible
if ${{ contains(fromJSON('["main", "ast-typegen-direct"]'), github.ref_name ) }}; then
npm run build-release
npx -p typescript tsc --strict --pretty ./build/ezno_lib.d.ts
fi
working-directory: src/js-cli-and-library
shell: bash
# WIP
- uses: actions/upload-artifact@v4
if: steps.changes.outputs.src == 'true' || github.ref_name == 'main'
with:
name: wasm-build
path: src/js-cli-and-library/dist
retention-days: 3
fuzzing_parser:
needs: validity
runs-on: ubuntu-latest
timeout-minutes: 15
continue-on-error: true
strategy:
matrix:
fuzz-target: [module_roundtrip_naive, module_roundtrip_structured]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_PATHS }}
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- uses: dorny/paths-filter@v3
id: changes
with:
filters: |
parser:
- 'parser/**'
- name: Install latest nightly and set it as default
if: steps.changes.outputs.parser == 'true'
run: |
rustup install nightly
rustup default nightly
# Current `cargo-fuzz` is broken: https://github.com/kaleidawave/ezno/pull/158#issuecomment-2171431210
# However `cargo install --git ...` does work below
# - uses: brndnmtthws/rust-action-cargo-binstall@v1
# if: steps.changes.outputs.parser == 'true'
# with:
# packages: cargo-fuzz
- name: Install cargo-fuzz
if: steps.changes.outputs.parser == 'true'
run: cargo install --git https://github.com/rust-fuzz/cargo-fuzz.git
- name: Run fuzzing
env:
SHORT_CIRCUIT: true
if: steps.changes.outputs.parser == 'true'
run: |
if ${{ env.SHORT_CIRCUIT }}; then
CARGO_TARGET_DIR=../../target cargo fuzz run -s none ${{ matrix.fuzz-target }} -- -timeout=10 -use_value_profile=1 -max_total_time=120
else
CARGO_TARGET_DIR=../../target cargo fuzz run -s none ${{ matrix.fuzz-target }} -- -timeout=10 -use_value_profile=1 -max_total_time=300 -fork=1 -ignore_crashes=1
if test -d fuzz/artifacts; then
find fuzz/artifacts -type f -print -exec xxd {} \; -exec cargo fuzz fmt -s none module_roundtrip_structured {} \;; false;
fi
fi
working-directory: parser/fuzz
fuzzing_checker:
needs: validity
runs-on: ubuntu-latest
timeout-minutes: 15
continue-on-error: true
strategy:
matrix:
fuzz-target: [check_project_naive]
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_PATHS }}
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- uses: dorny/paths-filter@v3
id: changes
with:
filters: |
checker:
- 'checker/**'
- name: Install latest nightly and set it as default
if: steps.changes.outputs.checker == 'true'
run: |
rustup install nightly
rustup default nightly
- name: Install cargo-fuzz
if: steps.changes.outputs.checker == 'true'
run: cargo install --git https://github.com/rust-fuzz/cargo-fuzz.git
- name: Run fuzzing
env:
SHORT_CIRCUIT: true
if: steps.changes.outputs.checker == 'true'
run: |
if ${{ env.SHORT_CIRCUIT }}; then
cargo fuzz run -s none ${{ matrix.fuzz-target }} -- -timeout=10 -use_value_profile=1 -max_total_time=120
else
cargo fuzz run -s none ${{ matrix.fuzz-target }} -- -timeout=10 -use_value_profile=1 -max_total_time=300 -fork=1 -ignore_crashes=1
# if test -d fuzz/artifacts; then
# find fuzz/artifacts -type f -print -exec xxd {} \; -exec cargo fuzz fmt -s none module_roundtrip_structured {} \;; false;
# fi
fi
ls .
ls target
working-directory: checker/fuzz
clippy:
needs: validity
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/cache@v4
with:
path: ${{ env.CACHE_PATHS }}
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Lint code with clippy
run: cargo clippy
publish-ability:
# TODO only need to do for `.toml` file changes
runs-on: ubuntu-latest
# `publish --dry-run` reports too many false positives and doesn't catch actual errors. So disabling for now
if: false
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: dorny/paths-filter@v3
id: changes
with:
filters: |
manifests:
- '**/*.toml'
- name: Check that it will publish to crates.io
if: steps.changes.outputs.manifests == 'true'
run: |
cargo metadata --offline --format-version 1 --no-deps | jq -r ".workspace_members[]" | while read -r _n _v pathInfo ; do
if ! grep -q "publish = false" "${pathInfo:13:-1}/Cargo.toml"; then
cd ${pathInfo:13:-1}
cargo publish --no-verify --dry-run
fi
done
shell: bash
performance-and-size:
# WIP
runs-on: ubuntu-latest
steps:
- name: Kick off other workflow if the PR has a label
if: github.ref_name != 'main' && contains(github.event.pull_request.labels.*.name, 'compiler-performance')
run: |
echo "head_ref: ${{ github.head_ref }}, ref_name: ${{ github.ref_name }}"
gh workflow run performance-and-size.yml --ref ${{ github.ref_name }}
env:
GH_TOKEN: ${{ github.token }}