279 lines
8.9 KiB
YAML
279 lines
8.9 KiB
YAML
# Main CI workflow
|
|
name: CI
|
|
|
|
# TODO: Setup coverage using cargo-mutants, but only for minor/major version bumps (would probably take hours :() -- also our testing infra sucks
|
|
|
|
on:
|
|
push:
|
|
branches: [main, 'v[0-9]+.[0-9]+.x']
|
|
pull_request:
|
|
branches: ['**']
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.ref_name == 'main' && github.sha || 'anysha' }}
|
|
cancel-in-progress: true
|
|
|
|
env:
|
|
CARGO_TERM_COLOR: always
|
|
RUST_BACKTRACE: 1
|
|
CARGO_INCREMENTAL: 0
|
|
|
|
jobs:
|
|
# Change detection
|
|
orchestrate:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
run_tests: ${{ steps.filter.outputs.run_tests }}
|
|
run_style: ${{ steps.filter.outputs.run_style }}
|
|
run_docs: ${{ steps.filter.outputs.run_docs }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: ${{ github.ref == 'refs/heads/main' && 2 || 350 }}
|
|
- id: filter
|
|
run: |
|
|
if [ -z "$GITHUB_BASE_REF" ]; then
|
|
COMPARE_REV="$(git rev-parse HEAD~1)"
|
|
else
|
|
git fetch origin "$GITHUB_BASE_REF" --depth=350
|
|
COMPARE_REV="$(git merge-base "origin/${GITHUB_BASE_REF}" HEAD)"
|
|
fi
|
|
CHANGED_FILES="$(git diff --name-only "$COMPARE_REV" "$GITHUB_SHA")"
|
|
|
|
check_pattern() {
|
|
local name="$1" pattern="$2" invert="${3:-false}"
|
|
if [ "$invert" = "true" ]; then
|
|
echo "$CHANGED_FILES" | grep -qvP "$pattern" && echo "${name}=true" >> "$GITHUB_OUTPUT" || echo "${name}=false" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "$CHANGED_FILES" | grep -qP "$pattern" && echo "${name}=true" >> "$GITHUB_OUTPUT" || echo "${name}=false" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
}
|
|
|
|
check_pattern "run_tests" '^(docs/|\.github/(ISSUE_TEMPLATE|workflows/)|README\.md|CHANGELOG\.md)' true
|
|
check_pattern "run_style" '\.(rs|toml)$|rust-toolchain\.toml|\.cargo/|clippy\.toml|typos\.toml'
|
|
check_pattern "run_docs" '^docs/|\.rs$'
|
|
|
|
# Formatting
|
|
fmt:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
with:
|
|
components: rustfmt
|
|
- uses: hustcer/setup-nu@v3
|
|
- uses: extractions/setup-just@v2
|
|
- run: just fmt-check
|
|
|
|
# Clippy
|
|
clippy:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
with:
|
|
components: clippy
|
|
- uses: Swatinem/rust-cache@v2
|
|
- name: Install system deps
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y libxkbcommon-dev libxkbcommon-x11-dev libwayland-dev libx11-dev libxcb-shape0-dev libxcb-xfixes0-dev libfontconfig-dev
|
|
- uses: hustcer/setup-nu@v3
|
|
- uses: extractions/setup-just@v2
|
|
- run: just clippy
|
|
|
|
# Spell check
|
|
typos:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: crate-ci/typos@v1.47.2
|
|
with:
|
|
config: typos.toml
|
|
|
|
# TOML formatting
|
|
taplo:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: uncenter/setup-taplo@v1
|
|
- run: taplo fmt --check
|
|
|
|
# Lockfile freshness
|
|
lockfile:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- name: Check Cargo.lock is up to date
|
|
run: cargo update && git diff --exit-code Cargo.lock
|
|
|
|
# Unused dependencies
|
|
machete:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: Swatinem/rust-cache@v2
|
|
- uses: taiki-e/install-action@cargo-machete
|
|
- uses: hustcer/setup-nu@v3
|
|
- uses: extractions/setup-just@v2
|
|
- run: just machete
|
|
|
|
# MSRV
|
|
msrv:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
with:
|
|
toolchain: 1.92.0
|
|
- uses: Swatinem/rust-cache@v2
|
|
- name: Install system deps
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y libxkbcommon-dev libxkbcommon-x11-dev libwayland-dev libx11-dev libxcb-shape0-dev libxcb-xfixes0-dev libfontconfig-dev
|
|
- uses: hustcer/setup-nu@v3
|
|
- uses: extractions/setup-just@v2
|
|
- run: just msrv-check
|
|
|
|
# WASM target (nightly + atomics)
|
|
check-wasm:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: Install nightly toolchain with rust-src and WASM target
|
|
run: rustup toolchain install nightly --component rust-src --target wasm32-unknown-unknown
|
|
- uses: Swatinem/rust-cache@v2
|
|
- uses: hustcer/setup-nu@v3
|
|
- uses: extractions/setup-just@v2
|
|
- run: just check-wasm-atomics
|
|
|
|
# Linux build + test
|
|
test-linux:
|
|
runs-on: ubuntu-latest
|
|
needs: [orchestrate]
|
|
if: needs.orchestrate.outputs.run_tests == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- uses: Swatinem/rust-cache@v2
|
|
- name: Install system deps
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y \
|
|
libxkbcommon-dev libwayland-dev libx11-dev \
|
|
libxcb-shape0-dev libxcb-xfixes0-dev \
|
|
libxcb-randr0-dev libxcb-xinput-dev \
|
|
libxkbcommon-x11-dev libegl1-mesa-dev \
|
|
libgles2-mesa-dev libglib2.0-dev libfontconfig-dev
|
|
- uses: hustcer/setup-nu@v3
|
|
- uses: extractions/setup-just@v2
|
|
- run: just build
|
|
- run: just test
|
|
- run: just test-doc
|
|
|
|
# macOS build + test
|
|
test-mac:
|
|
runs-on: macos-latest
|
|
needs: [orchestrate]
|
|
if: needs.orchestrate.outputs.run_tests == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- uses: Swatinem/rust-cache@v2
|
|
- uses: hustcer/setup-nu@v3
|
|
- uses: extractions/setup-just@v2
|
|
- run: just build
|
|
- run: just test
|
|
- run: just test-doc
|
|
|
|
# Windows build + test
|
|
test-windows:
|
|
runs-on: windows-latest
|
|
needs: [orchestrate]
|
|
if: needs.orchestrate.outputs.run_tests == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- uses: Swatinem/rust-cache@v2
|
|
- uses: hustcer/setup-nu@v3
|
|
- uses: extractions/setup-just@v2
|
|
- run: just build
|
|
- run: just test
|
|
|
|
# Examples
|
|
check-examples:
|
|
runs-on: ubuntu-latest
|
|
needs: [orchestrate]
|
|
if: needs.orchestrate.outputs.run_tests == 'true'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- uses: Swatinem/rust-cache@v2
|
|
- name: Install system deps
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y libxkbcommon-dev libxkbcommon-x11-dev libwayland-dev libx11-dev libxcb-shape0-dev libxcb-xfixes0-dev libfontconfig-dev
|
|
- name: Add WASM target
|
|
run: rustup target add wasm32-unknown-unknown
|
|
- uses: hustcer/setup-nu@v3
|
|
- uses: extractions/setup-just@v2
|
|
- run: just check-examples
|
|
|
|
# Beta toolchain (scheduled only)
|
|
beta-test:
|
|
if: github.event_name == 'schedule'
|
|
runs-on: ubuntu-latest
|
|
continue-on-error: true
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- run: rustup update beta && rustup default beta
|
|
- uses: Swatinem/rust-cache@v2
|
|
- name: Install system deps
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y libxkbcommon-dev libxkbcommon-x11-dev libwayland-dev libx11-dev libxcb-shape0-dev libxcb-xfixes0-dev libfontconfig-dev
|
|
- uses: hustcer/setup-nu@v3
|
|
- uses: extractions/setup-just@v2
|
|
- run: just check
|
|
- run: just test
|
|
|
|
# Gate job
|
|
tests-pass:
|
|
if: always()
|
|
needs:
|
|
- fmt
|
|
- clippy
|
|
- typos
|
|
- taplo
|
|
- lockfile
|
|
- machete
|
|
- msrv
|
|
- check-wasm
|
|
- test-linux
|
|
- test-mac
|
|
- test-windows
|
|
- check-examples
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- run: |
|
|
set +e
|
|
EXIT_CODE=0
|
|
check_result() {
|
|
echo "* $1: $2"
|
|
if [[ "$2" != "skipped" && "$2" != "success" ]]; then EXIT_CODE=1; fi
|
|
}
|
|
check_result fmt ${{ needs.fmt.result }}
|
|
check_result clippy ${{ needs.clippy.result }}
|
|
check_result typos ${{ needs.typos.result }}
|
|
check_result taplo ${{ needs.taplo.result }}
|
|
check_result lockfile ${{ needs.lockfile.result }}
|
|
check_result machete ${{ needs.machete.result }}
|
|
check_result msrv ${{ needs.msrv.result }}
|
|
check_result check-wasm ${{ needs.check-wasm.result }}
|
|
check_result test-linux ${{ needs.test-linux.result }}
|
|
check_result test-mac ${{ needs.test-mac.result }}
|
|
check_result test-windows ${{ needs.test-windows.result }}
|
|
check_result check-examples ${{ needs.check-examples.result }}
|
|
exit $EXIT_CODE
|