Skip to content

ci

ci #1877

Workflow file for this run

name: ci
on:
pull_request: {}
push:
branches:
- master
schedule: [cron: "40 1 * * *"]
jobs:
commitsar:
name: Verify commit messages
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: aevea/commitsar@v0.20.2
pre-commit:
name: Generic pre-commit checks
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1
- uses: actions/setup-python@v5
with:
python-version: 3.11
- run: pip install pre-commit
- run: SKIP=fmt,cargo-check,clippy pre-commit run --all-files
eslint:
name: ESLint
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Cache NPM dependencies
uses: actions/cache@v4
with:
path: node_modules
key: npm-cache-lint-node@16-${{ hashFiles('yarn.lock') }}
- name: "Install dependencies"
run: yarn install --immutable --registry https://registry.npmjs.org --network-timeout 300000
working-directory: ./bindings/javascript
- name: ESLint
run: yarn lint
working-directory: ./bindings/javascript
test-stable:
name: Test (stable)
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.11
cache: "pip"
cache-dependency-path: "**/requirements-*.txt"
- name: Start background server
run: |
python -m pip install -r ./css-inline/tests/requirements-test.txt
# Starts the server in background
python ./css-inline/tests/server.py &
shell: bash
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
workspaces: css-inline
- run: cargo test --no-fail-fast
working-directory: ./css-inline
fmt:
name: Rustfmt
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
with:
components: rustfmt
- run: cargo fmt --all -- --check
working-directory: ./css-inline
- run: cargo fmt --all -- --check
working-directory: ./profiler
- run: cargo fmt --all -- --check
working-directory: ./bindings/c
- run: cargo fmt --all -- --check
working-directory: ./bindings/javascript
- run: cargo fmt --all -- --check
working-directory: ./bindings/python
- run: cargo fmt --all -- --check
working-directory: ./bindings/ruby
clippy:
name: Clippy
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
with:
workspaces: |
css-inline
bindings/javascript
bindings/python
bindings/ruby
bindings/c
bindings/profiler
- name: Rust
run: cargo clippy -- -D warnings
working-directory: ./css-inline
- name: Profiler
run: cargo clippy -- -D warnings
working-directory: ./profiler
- name: Python
run: cargo clippy -- -D warnings
working-directory: ./bindings/python
- name: JavaScript
run: cargo clippy -- -D warnings
working-directory: ./bindings/javascript
- name: Ruby
run: cargo clippy -- -D warnings
working-directory: ./bindings/ruby
- name: C
run: cargo clippy -- -D warnings
working-directory: ./bindings/c
msrv:
name: MSRV
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.65"
- uses: Swatinem/rust-cache@v2
with:
workspaces: css-inline
- run: cargo build
working-directory: ./css-inline
test-javascript:
strategy:
fail-fast: false
matrix:
settings:
- host: macos-12
target: x86_64-apple-darwin
build: |
yarn build
strip -x *.node
- host: macos-12
target: aarch64-apple-darwin
build: |
sudo rm -Rf /Library/Developer/CommandLineTools/SDKs/*;
export CC=$(xcrun -f clang);
export CXX=$(xcrun -f clang++);
SYSROOT=$(xcrun --sdk macosx --show-sdk-path);
export CFLAGS="-isysroot $SYSROOT -isystem $SYSROOT";
yarn build --target aarch64-apple-darwin
strip -x *.node
- host: windows-2022
build: yarn build
target: x86_64-pc-windows-msvc
- host: ubuntu-22.04
target: x86_64-unknown-linux-gnu
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
build: |-
set -e &&
yarn build --target x86_64-unknown-linux-gnu &&
strip *.node
- host: ubuntu-22.04
target: x86_64-unknown-linux-musl
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
build: set -e && yarn build && strip *.node
- host: ubuntu-22.04
target: aarch64-unknown-linux-gnu
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64
build: |-
set -e &&
yarn build --target aarch64-unknown-linux-gnu &&
aarch64-unknown-linux-gnu-strip *.node
- host: ubuntu-22.04
target: armv7-unknown-linux-gnueabihf
setup: |
sudo apt-get update
sudo apt-get install gcc-arm-linux-gnueabihf -y
build: |
yarn build --target armv7-unknown-linux-gnueabihf
arm-linux-gnueabihf-strip *.node
- host: ubuntu-22.04
target: aarch64-unknown-linux-musl
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
build: |-
set -e &&
rustup target add aarch64-unknown-linux-musl &&
yarn build --target aarch64-unknown-linux-musl &&
/aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node
- host: ubuntu-22.04
target: aarch64-linux-android
build: |
yarn build --target aarch64-linux-android
${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip *.node
- host: ubuntu-22.04
target: armv7-linux-androideabi
build: |
yarn build --target armv7-linux-androideabi
${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip *.node
node:
- "18"
- "20"
name: NodeJS ${{ matrix.node }} on ${{ matrix.settings.target }}
runs-on: ${{ matrix.settings.host }}
env:
DEBUG: napi:*
APP_NAME: css-inline
MACOSX_DEPLOYMENT_TARGET: "10.13"
steps:
- uses: actions/checkout@v4
- name: Setup node
uses: actions/setup-node@v4
if: ${{ !matrix.settings.docker }}
with:
node-version: ${{ matrix.node }}
cache: yarn
cache-dependency-path: bindings/javascript/yarn.lock
- uses: actions/setup-python@v5
with:
python-version: 3.11
cache: "pip"
cache-dependency-path: "**/requirements-*.txt"
- name: Start background server
run: |
python -m pip install -r ./css-inline/tests/requirements-test.txt
# Starts the server in background
python ./css-inline/tests/server.py &
shell: bash
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
if: ${{ !matrix.settings.docker }}
with:
toolchain: stable
targets: ${{ matrix.settings.target }}
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
.cargo-cache
target/
key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }}
- uses: goto-bus-stop/setup-zig@v2
if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' }}
with:
version: 0.11.0
- name: Setup toolchain
run: ${{ matrix.settings.setup }}
if: ${{ matrix.settings.setup }}
shell: bash
- name: Config yarn (x86_64-unknown-linux-musl)
if: matrix.settings.target == 'x86_64-unknown-linux-musl'
run: yarn config set supportedArchitectures.libc "musl"
working-directory: bindings/javascript
- name: Config yarn (aarch64-unknown-linux-gnu)
if: matrix.settings.target == 'aarch64-unknown-linux-gnu'
run: |
yarn config set supportedArchitectures.cpu "arm64"
yarn config set supportedArchitectures.libc "glibc"
working-directory: bindings/javascript
- name: Config yarn (aarch64-unknown-linux-musl)
if: matrix.settings.target == 'aarch64-unknown-linux-musl'
run: |
yarn config set supportedArchitectures.cpu "arm64"
yarn config set supportedArchitectures.libc "musl"
working-directory: bindings/javascript
- name: Config yarn (armv7-unknown-linux-gnueabihf)
if: matrix.settings.target == 'armv7-unknown-linux-gnueabihf'
run: yarn config set supportedArchitectures.cpu "arm"
working-directory: bindings/javascript
- name: Config yarn (aarch64-linux-android)
if: matrix.settings.target == 'aarch64-linux-android'
run: yarn config set supportedArchitectures.cpu "arm64"
working-directory: bindings/javascript
- name: Config yarn (armv7-linux-androideabi)
if: matrix.settings.target == 'armv7-linux-androideabi'
run: yarn config set supportedArchitectures.cpu "arm"
working-directory: bindings/javascript
- name: Install dependencies
run: yarn install
working-directory: bindings/javascript
- name: Build in docker
uses: addnab/docker-run-action@v3
if: ${{ matrix.settings.docker }}
with:
image: ${{ matrix.settings.docker }}
options: "--user 0:0 -v ${{ github.workspace }}/.cargo-cache/git/db:/usr/local/cargo/git/db -v ${{ github.workspace }}/.cargo/registry/cache:/usr/local/cargo/registry/cache -v ${{ github.workspace }}/.cargo/registry/index:/usr/local/cargo/registry/index -v ${{ github.workspace }}:/build -w /build/bindings/javascript"
run: ${{ matrix.settings.build }}
- name: Build
run: ${{ matrix.settings.build }}
if: ${{ !matrix.settings.docker }}
shell: bash
working-directory: bindings/javascript
- name: Set up QEMU (aarch64)
uses: docker/setup-qemu-action@v3
if: ${{ contains(fromJson('["aarch64-unknown-linux-gnu", "aarch64-unknown-linux-musl"]'), matrix.settings.target) }}
with:
platforms: arm64
- name: Set up QEMU (armv7-unknown-linux-gnueabihf)
uses: docker/setup-qemu-action@v3
if: matrix.settings.target == 'armv7-unknown-linux-gnueabihf'
with:
platforms: arm
- run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
if: ${{ contains(fromJson('["aarch64-unknown-linux-gnu", "aarch64-unknown-linux-musl", "armv7-unknown-linux-gnueabihf"]'), matrix.settings.target) }}
- name: Test (x86_64-apple-darwin & x86_64-pc-windows-msvc)
if: ${{ contains(fromJson('["x86_64-apple-darwin", "x86_64-pc-windows-msvc"]'), matrix.settings.target) }}
run: yarn test
working-directory: bindings/javascript
- name: Test (x86_64-unknown-linux-gnu)
if: matrix.settings.target == 'x86_64-unknown-linux-gnu'
run: docker run --rm --network host -v $(pwd):/build -w /build/bindings/javascript node:${{ matrix.node }}-slim yarn test
- name: Test (x86_64-unknown-linux-musl)
if: matrix.settings.target == 'x86_64-unknown-linux-musl'
run: docker run --rm --network host -v $(pwd):/build -w /build/bindings/javascript node:${{ matrix.node }}-alpine yarn test
- name: Test (aarch64-unknown-linux-gnu)
if: matrix.settings.target == 'aarch64-unknown-linux-gnu'
uses: addnab/docker-run-action@v3
with:
image: node:${{ matrix.node }}-slim
options: "--platform linux/arm64 --network host -v ${{ github.workspace }}:/build -w /build/bindings/javascript"
run: |
set -e
yarn test
- name: Test in docker (aarch64-unknown-linux-musl)
if: matrix.settings.target == 'aarch64-unknown-linux-musl'
uses: addnab/docker-run-action@v3
with:
image: node:${{ matrix.node }}-alpine
options: "--platform linux/arm64 --network host -v ${{ github.workspace }}:/build -w /build/bindings/javascript"
run: |
set -e
yarn test
- name: Test in docker (armv7-unknown-linux-gnueabihf)
if: matrix.settings.target == 'armv7-unknown-linux-gnueabihf'
uses: addnab/docker-run-action@v3
with:
image: node:${{ matrix.node }}-bullseye-slim
options: "--platform linux/arm/v7 --network host -v ${{ github.workspace }}:/build -w /build/bindings/javascript"
run: |
set -e
yarn test
test-python:
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, macos-12, windows-2022]
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
name: Python ${{ matrix.python-version }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
architecture: x64
cache: "pip"
cache-dependency-path: "**/requirements-*.txt"
- name: Start background server
run: |
python -m pip install -r ./css-inline/tests/requirements-test.txt
# Starts the server in background
python ./css-inline/tests/server.py &
shell: bash
- run: python -m pip install -r requirements/dev.txt
working-directory: ./bindings/python
- name: Run ${{ matrix.python }} tox job
run: tox -e py
working-directory: ./bindings/python
test-ruby:
strategy:
fail-fast: false
matrix:
os: [ubuntu-22.04, macos-12, windows-2022]
ruby-version: ["2.7", "3.2", "3.3"]
name: Ruby ${{ matrix.ruby-version }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Set up Ruby & Rust
uses: oxidize-rb/actions/setup-ruby-and-rust@main
with:
ruby-version: ${{ matrix.ruby-version }}
bundler-cache: true
cargo-cache: true
cache-version: v1
working-directory: ./bindings/ruby
- uses: actions/setup-python@v5
with:
python-version: 3.11
cache: "pip"
cache-dependency-path: "**/requirements-*.txt"
- name: Start background server
run: |
python -m pip install -r ./css-inline/tests/requirements-test.txt
# Starts the server in background
python ./css-inline/tests/server.py &
shell: bash
- run: bundle exec rake test
working-directory: ./bindings/ruby
test-wasm:
name: WASM module tests
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Setup node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: yarn
cache-dependency-path: bindings/javascript/yarn.lock
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
workspaces: bindings/javascript
cache-all-crates: "true"
- name: Install wasm-pack
run: cargo install wasm-pack
- name: Install dependencies
run: yarn install
working-directory: ./bindings/javascript
- name: Build Wasm
run: yarn build:wasm
working-directory: ./bindings/javascript
- name: Test Wasm
run: yarn test:wasm
working-directory: ./bindings/javascript
test-c:
name: C bindings tests
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Build
run: cargo build
working-directory: ./bindings/c
- name: Run tests
run: |
gcc -c -I. tests/main.c
gcc main.o target/debug/libcss_inline.so -o out
./out
working-directory: ./bindings/c
features:
name: Check features
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
workspaces: css-inline
cache-all-crates: "true"
- uses: taiki-e/install-action@cargo-hack
- run: cargo hack check --feature-powerset --lib
working-directory: ./css-inline
coverage:
name: Code coverage
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
workspaces: css-inline
cache-all-crates: "true"
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@cargo-llvm-cov
- uses: taiki-e/install-action@cargo-hack
- uses: actions/setup-python@v5
with:
python-version: 3.11
cache: "pip"
cache-dependency-path: "**/requirements-*.txt"
- name: Start background server
run: |
python -m pip install -r ./css-inline/tests/requirements-test.txt
# Starts the server in background
python ./css-inline/tests/server.py &
shell: bash
- name: Run tests
run: cargo hack llvm-cov --no-report --feature-powerset
working-directory: ./css-inline
- name: Generate coverage reports
run: cargo llvm-cov report --lcov --output-path lcov.info
working-directory: ./css-inline
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
name: coverage
files: lcov.info
fail_ci_if_error: true
fuzz:
name: Fuzz
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: Swatinem/rust-cache@v2
with:
workspaces: css-inline
cache-all-crates: "true"
- run: cargo install cargo-fuzz
- run: cargo fuzz run inline -- -max_total_time=60
working-directory: ./css-inline