Skip to content

Build

Build #7

Workflow file for this run

name: Build
on:
workflow_dispatch:
release:
types:
- published
push:
tags:
- "v*.*.*"
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
# cf. https://github.com/oxigraph/oxigraph/blob/main/.github/workflows/artifacts.yml
jobs:
npm_tarball:
name: 🦊 Build npm package
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install wasm-pack
run: cargo install wasm-pack
- name: Setup NodeJS
uses: actions/setup-node@v4
with:
node-version: 20
registry-url: 'https://registry.npmjs.org'
cache: npm
cache-dependency-path: "./js/package.json"
- name: Build npm package
run: npm run pack
working-directory: ./js
- name: Upload tarball
uses: actions/upload-artifact@v4
with:
name: curies_npm
path: ./js/pkg
- run: npm run release
working-directory: ./js
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
if: github.event_name == 'release'
publish_crates:
name: 📦️ Publish crates to crates.io
if: github.event_name == 'release'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: rustup update
- run: cargo login $CRATES_IO_TOKEN
env:
CRATES_IO_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}
- run: cargo publish
working-directory: ./lib
# Inspired by pydantic: https://github.com/pydantic/pydantic-core/blob/main/.github/workflows/ci.yml
build_wheels:
name: 🐍 Wheels for ${{ matrix.os }} (${{ matrix.target }} - ${{ matrix.interpreter || 'all' }}${{ matrix.os == 'linux' && format(' - {0}', matrix.manylinux == 'auto' && 'manylinux' || matrix.manylinux) || '' }})
strategy:
fail-fast: false
matrix:
os: [linux, macos, windows]
target: [x86_64, aarch64]
manylinux: [auto]
include:
# Using pypy when possible for performance
# manylinux for various platforms, plus x86_64 pypy
- os: linux
manylinux: auto
target: i686
- os: linux
manylinux: auto
target: aarch64 # -bit ARM
- os: linux
manylinux: auto
target: armv7 # 32-bit ARM
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
- os: linux
manylinux: auto
target: x86_64
# musllinux
- os: linux
manylinux: musllinux_1_1
target: x86_64
- os: linux
manylinux: musllinux_1_1
target: aarch64
# MacOS
- os: macos
target: x86_64
- os: macos
target: aarch64
# Windows
# x86_64 pypy builds are not PGO optimized, i686 not supported by pypy, aarch64 only 3.11 and up, also not PGO optimized
# x86_64 pypy3.9 pypy3.10 failing due to ring
- os: windows
target: x86_64
interpreter: 3.8 3.9 3.10 3.11 3.12
- os: windows
target: i686
python-architecture: x86
interpreter: 3.8 3.9 3.10 3.11 3.12
- os: windows
target: aarch64
interpreter: 3.11 3.12
runs-on: ${{ (matrix.os == 'linux' && 'ubuntu') || matrix.os }}-latest
steps:
- uses: actions/checkout@v4
- uses: docker/setup-qemu-action@v3
if: matrix.os == 'linux' && matrix.target == 'aarch64'
with:
platforms: linux/${{ matrix.target }}
- if: matrix.os == 'linux'
run: sudo apt install libssl-dev
- uses: actions/setup-python@v5
with:
python-version: '3.11'
architecture: ${{ matrix.python-architecture || 'x64' }}
- run: pip install -U twine 'ruff==0.1.3' typing_extensions
# generate self-schema now, so we don't have to do so inside docker in maturin build
# - run: python generate_self_schema.py
- 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 pypy3.8 pypy3.9 pypy3.10' }}
rust-toolchain: stable
docker-options: -e CI
working-directory: python
# env:
# CFLAGS_aarch64_unknown_linux_gnu: -D__ARM_ARCH=8
# # NOTE: ring linux aarch64 error: https://github.com/briansmith/ring/issues/1728
- run: ${{ (matrix.os == 'windows' && 'dir') || 'ls -lh' }} python/dist/
- run: twine check --strict python/dist/*
- uses: actions/upload-artifact@v4
with:
name: nanopub_wheel_${{ matrix.os }}_${{ matrix.target }}_${{ matrix.interpreter || 'all' }}_${{ matrix.manylinux }}
path: python/dist
- name: Publish to PyPI
if: github.event_name == 'release'
# if: startsWith(github.ref, 'refs/tags/')
run: twine upload python/dist/*
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}