ci #2102
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.70" | |
- 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: windows-2022 | |
build: yarn build --target aarch64-pc-windows-msvc | |
target: aarch64-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 (aarch64-pc-windows-msvc) | |
if: matrix.settings.target == 'aarch64-pc-windows-msvc' | |
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 | |
env: | |
LD_LIBRARY_PATH: target/debug | |
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 |