Skip to content

Batson

Batson #632

Workflow file for this run

name: CI
on:
push:
branches:
- main
tags:
- '**'
pull_request: {}
jobs:
resolve:
runs-on: ubuntu-latest
outputs:
MSRV: ${{ steps.resolve-msrv.outputs.MSRV }}
steps:
- uses: actions/checkout@v4
- name: set up python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: resolve MSRV
id: resolve-msrv
run:
echo MSRV=`python -c 'import tomllib; print(tomllib.load(open("Cargo.toml", "rb"))["workspace"]["package"]["rust-version"])'` >> $GITHUB_OUTPUT
test-linux:
needs: [resolve]
name: test rust-${{ matrix.rust-version }} on linux
strategy:
fail-fast: false
matrix:
rust-version: [stable, nightly]
include:
- rust-version: ${{ needs.resolve.outputs.MSRV }}
runs-on: ubuntu-latest
env:
RUNS_ON: ubuntu-latest
RUST_VERSION: ${{ matrix.rust-version }}
steps:
- uses: actions/checkout@v4
- name: set up python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust-version }}
- id: cache-rust
uses: Swatinem/rust-cache@v2
with:
prefix-key: "v1-rust"
- run: cargo install cargo-careful
if: steps.cache-rust.outputs.cache-hit != 'true'
- run: cargo test -F python
- run: cargo careful t -F python
if: matrix.rust-version == 'nightly'
- uses: taiki-e/install-action@cargo-llvm-cov
- run: cargo llvm-cov -F python --codecov --output-path codecov.json
- uses: codecov/codecov-action@v4
with:
env_vars: RUNS_ON,RUST_VERSION
files: codecov.json
token: ${{ secrets.CODECOV_TOKEN }}
test-macos:
name: test on ${{ matrix.runs-on }}
strategy:
fail-fast: false
matrix:
runs-on: [macos-latest, macos-latest-xlarge]
runs-on: ${{ matrix.runs-on }}
env:
RUNS_ON: ${{ matrix.runs-on }}
RUST_VERSION: stable
steps:
- uses: actions/checkout@v4
- name: set up python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- uses: dtolnay/rust-toolchain@stable
- id: cache-rust
uses: Swatinem/rust-cache@v2
- run: cargo test -F python
env:
RUST_BACKTRACE: 1
- uses: taiki-e/install-action@cargo-llvm-cov
- run: cargo llvm-cov -F python --codecov --output-path codecov.json
- uses: codecov/codecov-action@v4
with:
env_vars: RUNS_ON,RUST_VERSION
files: codecov.json
token: ${{ secrets.CODECOV_TOKEN }}
test-python:
name: test jiter-python
runs-on: ubuntu-latest
env:
RUNS_ON: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: set up python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- uses: dtolnay/rust-toolchain@stable
- id: cache-rust
uses: Swatinem/rust-cache@v2
- run: cargo install rustfilt coverage-prepare
if: steps.cache-rust.outputs.cache-hit != 'true'
- run: rustup component add llvm-tools-preview
- run: make python-install
- run: pip install -e crates/jiter-python
env:
RUSTFLAGS: '-C instrument-coverage'
- run: pytest crates/jiter-python/tests
env:
RUST_BACKTRACE: 1
- run: python crates/jiter-python/bench.py --fast
- run: coverage-prepare lcov $(python -c 'import jiter.jiter;print(jiter.jiter.__file__)')
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
bench:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: moonrepo/setup-rust@v1
with:
channel: stable
cache-target: release
bins: cargo-codspeed
- run: python crates/jiter/benches/generate_big.py
- run: cargo codspeed build -F python -p jiter
- uses: CodSpeedHQ/action@v2
with:
run: cargo codspeed run
token: ${{ secrets.CODSPEED_TOKEN }}
fuzz:
name: fuzz on ${{ matrix.runs-on }}
strategy:
fail-fast: false
matrix:
runs-on: [ubuntu-latest, macos-latest-xlarge]
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v4
- uses: moonrepo/setup-rust@v1
with:
channel: nightly
cache-target: release
bins: cargo-fuzz
- run: |
# cargo fuzz defaults to musl targets, which is seeming incomatible with sanitizers according to CI failures
RUST_TARGET=$(rustc -Vv | grep host | cut -d ' ' -f 2)
cargo fuzz run --target=$RUST_TARGET --fuzz-dir crates/fuzz compare_to_serde --release -- -max_total_time=300s
fuzz-skip:
name: fuzz skip
# we only run this on ubuntu since architecture should make no difference
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: moonrepo/setup-rust@v1
with:
channel: nightly
cache-target: release
bins: cargo-fuzz
- run: |
# cargo fuzz defaults to musl targets, which is seeming incomatible with sanitizers according to CI failures
RUST_TARGET=$(rustc -Vv | grep host | cut -d ' ' -f 2)
cargo fuzz run --target=$RUST_TARGET --fuzz-dir crates/fuzz compare_skip --release -- -max_total_time=300s
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: moonrepo/setup-rust@v1
with:
channel: stable
components: rustfmt, clippy
- uses: pre-commit/[email protected]
with:
extra_args: --all-files --verbose
env:
PRE_COMMIT_COLOR: always
SKIP: test
- run: cargo doc -F python
build-sdist:
name: build sdist
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: PyO3/maturin-action@v1
with:
# version pinned until https://github.com/PyO3/maturin/issues/2154 is fixed
maturin-version: v1.6.0
command: sdist
args: --out dist
rust-toolchain: stable
working-directory: crates/jiter-python
- uses: actions/upload-artifact@v4
with:
name: pypi_files_sdist
path: crates/jiter-python/dist
build:
name: build on ${{ matrix.os }} (${{ matrix.target }} - ${{ matrix.interpreter || 'all' }}${{ matrix.os == 'linux' && format(' - {0}', matrix.manylinux == 'auto' && 'manylinux' || matrix.manylinux) || '' }})
# only run on push to main and on release
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || contains(github.event.pull_request.labels.*.name, 'Full Build')
strategy:
fail-fast: false
matrix:
os: [linux] # windows and macos builds added manually
target: [x86_64, aarch64]
manylinux: [auto]
include:
# manylinux for various platforms
- os: linux
manylinux: auto
target: i686
- os: linux
manylinux: auto
target: aarch64
- os: linux
manylinux: auto
target: armv7
interpreter: 3.8 3.9 3.10 3.11 3.12
- os: linux
manylinux: auto
target: ppc64le
interpreter: 3.8 3.9 3.10 3.11 3.12
- os: linux
manylinux: auto
target: s390x
interpreter: 3.8 3.9 3.10 3.11 3.12
# musllinux
- os: linux
manylinux: musllinux_1_1
target: x86_64
- os: linux
manylinux: musllinux_1_1
target: aarch64
# macos;
# all versions x86_64
# older pythons which can't be run on the arm hardware for PGO
- os: macos
target: x86_64
- os: macos
target: aarch64
interpreter: 3.8 3.9
# windows;
# aarch64 only 3.11 and up, also not PGO optimized
- os: windows
target: i686
python-architecture: x86
interpreter: 3.8 3.9 3.10 3.11 3.12
# FIXME had link failures, needs investigation
# - os: windows
# target: aarch64
# interpreter: 3.11 3.12
exclude:
# PGO optimized below
- os: linux
manylinux: auto
target: x86_64
runs-on: ${{ (matrix.os == 'linux' && 'ubuntu') || matrix.os }}-latest
steps:
- uses: actions/checkout@v4
- name: set up python
uses: actions/setup-python@v5
with:
python-version: '3.12'
architecture: ${{ matrix.python-architecture || 'x64' }}
- name: build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
manylinux: ${{ matrix.manylinux }}
args: --release --out dist --interpreter ${{ matrix.interpreter || '3.8 3.9 3.10 3.11 3.12' }}
rust-toolchain: stable
working-directory: crates/jiter-python
- run: ${{ (matrix.os == 'windows' && 'dir') || 'ls -lh' }} crates/jiter-python/dist/
- run: |
pip install -U twine
twine check --strict crates/jiter-python/dist/*
- uses: actions/upload-artifact@v4
with:
name: pypi_files_${{ matrix.os }}_${{ matrix.target }}_${{ matrix.interpreter || 'all' }}_${{ matrix.manylinux }}
path: crates/jiter-python/dist
build-pgo:
name: build pgo-optimized on ${{ matrix.os }} / ${{ matrix.interpreter }}
# only run on push to main and on release
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || contains(github.event.pull_request.labels.*.name, 'Full Build')
strategy:
fail-fast: false
matrix:
os: [linux, windows, macos]
interpreter: ['3.8', '3.9', '3.10', '3.11', '3.12']
include:
# standard runners with override for macos arm
- os: linux
runs-on: ubuntu-latest
- os: windows
ls: dir
runs-on: windows-latest
- os: macos
runs-on: macos-latest
exclude:
# macos arm only supported from 3.10 and up
- os: macos
interpreter: '3.8'
- os: macos
interpreter: '3.9'
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v4
- name: set up python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.interpreter }}
- name: install rust stable
id: rust-toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: llvm-tools
- run: rustc --version --verbose
- name: build initial wheel
uses: PyO3/maturin-action@v1
with:
manylinux: auto
args: >
--release
--out pgo-wheel
--interpreter ${{ matrix.interpreter }}
rust-toolchain: stable
working-directory: crates/jiter-python
env:
RUSTFLAGS: "-Cprofile-generate=${{ github.workspace }}/profdata"
- name: detect rust host
run: echo RUST_HOST=$(rustc -Vv | grep host | cut -d ' ' -f 2) >> "$GITHUB_ENV"
shell: bash
- name: generate pgo data
run: |
cd crates/jiter-python
pip install -U pip
pip install -r tests/requirements.txt
pip install jiter --no-index --no-deps --find-links pgo-wheel --force-reinstall
python bench.py jiter jiter-cache
rustup run stable bash -c 'echo LLVM_PROFDATA=$RUSTUP_HOME/toolchains/$RUSTUP_TOOLCHAIN/lib/rustlib/${{ env.RUST_HOST }}/bin/llvm-profdata >> "$GITHUB_ENV"'
- name: merge pgo data
run: |
cd crates/jiter-python
${{ env.LLVM_PROFDATA }} merge -o ${{ github.workspace }}/merged.profdata ${{ github.workspace }}/profdata
- name: build pgo-optimized wheel
uses: PyO3/maturin-action@v1
with:
manylinux: auto
args: >
--release
--out dist
--interpreter ${{ matrix.interpreter }}
rust-toolchain: stable
working-directory: crates/jiter-python
env:
RUSTFLAGS: "-Cprofile-use=${{ github.workspace }}/merged.profdata"
- run: ${{ matrix.ls || 'ls -lh' }} crates/jiter-python/dist/
- uses: actions/upload-artifact@v4
with:
name: pypi_files_${{ matrix.os }}_${{ matrix.interpreter }}
path: crates/jiter-python/dist
inspect-pypi-assets:
needs: [build, build-sdist, build-pgo]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: get dist artifacts
uses: actions/download-artifact@v4
with:
pattern: pypi_files_*
merge-multiple: true
path: dist
- name: list dist files
run: |
ls -lh dist/
ls -l dist/
echo "`ls dist | wc -l` files"
- name: extract and list sdist file
run: |
mkdir sdist-files
tar -xvf dist/*.tar.gz -C sdist-files
tree -a sdist-files
- name: extract and list wheel file
run: |
ls dist/*cp310-manylinux*x86_64.whl | head -n 1
python -m zipfile --list `ls dist/*cp310-manylinux*x86_64.whl | head -n 1`
test-builds-arch:
name: test build on ${{ matrix.target }}-${{ matrix.distro }}
needs: [build]
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
target: [aarch64, armv7, s390x, ppc64le]
distro: ['ubuntu22.04']
include:
- target: aarch64
distro: alpine_latest
steps:
- uses: actions/checkout@v4
- name: get dist artifacts
uses: actions/download-artifact@v4
with:
pattern: pypi_files_linux_*
merge-multiple: true
path: crates/jiter-python/dist
- uses: uraimo/[email protected]
name: install & test
with:
arch: ${{ matrix.target }}
distro: ${{ matrix.distro }}
githubToken: ${{ github.token }}
install: |
set -x
if command -v apt-get &> /dev/null; then
echo "installing python & pip with apt-get..."
apt-get update
apt-get install -y --no-install-recommends python3 python3-pip python3-venv git
else
echo "installing python & pip with apk..."
apk update
apk add python3 py3-pip git
fi
run: |
cd crates/jiter-python
set -x
# typing-extensions isn't automatically installed because of `--no-index --no-deps`
python3 -m venv venv
source venv/bin/activate
python3 -m pip install -U pip -r tests/requirements.txt
python3 -m pip install jiter --no-index --no-deps --find-links dist --force-reinstall
python3 -c 'import jiter; print(jiter.__version__)'
test-builds-os:
name: test build on ${{ matrix.os }}
needs: [build, build-pgo]
strategy:
fail-fast: false
matrix:
os: [ubuntu, macos, windows]
runs-on: ${{ matrix.os }}-latest
steps:
- uses: actions/checkout@v4
- name: set up python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: get dist artifacts
uses: actions/download-artifact@v4
with:
pattern: pypi_files_*
merge-multiple: true
path: crates/jiter-python/dist
- name: run tests
run: |
python3 -m pip install -U pip -r tests/requirements.txt
python3 -m pip install jiter --no-index --no-deps --find-links dist --force-reinstall
python3 -m pytest
working-directory: crates/jiter-python
# https://github.com/marketplace/actions/alls-green#why used for branch protection checks
check:
if: always()
needs: [test-linux, test-macos, test-python, bench, fuzz, fuzz-skip, lint]
runs-on: ubuntu-latest
steps:
- name: Decide whether the needed jobs succeeded or failed
uses: re-actors/alls-green@release/v1
with:
jobs: ${{ toJSON(needs) }}
release:
needs: [check]
if: "success() && startsWith(github.ref, 'refs/tags/')"
runs-on: ubuntu-latest
environment: release
steps:
- uses: actions/checkout@v2
- name: install rust stable
uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo publish -p jiter
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
release-python:
needs: [test-builds-arch, test-builds-os, build-sdist, check]
if: "success() && startsWith(github.ref, 'refs/tags/')"
runs-on: ubuntu-latest
environment: release-python
permissions:
id-token: write
steps:
- uses: actions/checkout@v4
- name: set up python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: get dist artifacts
uses: actions/download-artifact@v4
with:
pattern: pypi_files_*
merge-multiple: true
path: dist
- run: pip install -U twine
- run: ls -l dist/
- run: twine check --strict dist/*
- name: upload to pypi
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: dist/