Skip to content

ci: 🎡 fix macOS actions logic #174

ci: 🎡 fix macOS actions logic

ci: 🎡 fix macOS actions logic #174

Workflow file for this run

name: Build
on:
push:
branches:
- main
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
build_environment:
name: ${{ matrix.os }} build environment
runs-on: ${{ matrix.os }}
env:
PCRE_VERSION: "8.45"
outputs:
build-deps-cache-key: ${{ steps.build-deps-cache-key.outputs.value }}
strategy:
fail-fast: true
matrix:
os: [ubuntu-22.04, macos-12-xl, flyci-macos-large-latest-m1]
steps:
- name: Checkout python-hyperscan
uses: actions/checkout@v4
- name: Setup macOS environment
if: contains(matrix.os, 'macos')
run: |
gid=$(id -g)
uid=$(id -u)
sudo mkdir -p /opt/vectorscan /opt/pcre
sudo chown -R $uid:$gid /opt/vectorscan /opt/pcre
- name: Restore build dependencies cache (macOS)
id: build-deps-macos
if: contains(matrix.os, 'macos')
uses: actions/cache/restore@v4
with:
key: build-deps-${{ runner.os }}-${{ matrix.os }}
path: |
/opt/vectorscan
/opt/pcre
- name: Build Hyperscan (macOS)
if: contains(matrix.os, 'macos') && steps.build-deps-macos.outputs.cache-hit != 'true'
run: |
./build_tools/macos/build_hyperscan.sh
- name: Upload build dependencies (macOS)
if: contains(matrix.os, 'macos') && steps.build-deps-macos.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
key: ${{ steps.build-deps-macos.outputs.cache-primary-key }}
path: |
/opt/vectorscan
/opt/pcre
- name: Capture build dependencies cache key
id: build-deps-cache-key
run: |
echo "value=${{ contains(matrix.os, 'macos') && steps.build-deps-macos.outputs.cache-primary-key || '' }}" >> $GITHUB_OUTPUT
build_wheels:
name: ${{ matrix.python_id }}-${{ matrix.platform_id }} wheel
runs-on: ${{ matrix.os }}
if: github.repository == 'darvid/python-hyperscan'
env:
PCRE_VERSION: "8.45"
needs: [build_environment]
strategy:
fail-fast: false
matrix:
include:
# TODO: Windows support
# 🐧 manylinux x86_64
- os: ubuntu-22.04
python: "3.9"
python_id: cp39
platform_id: manylinux_x86_64
- os: ubuntu-22.04
python: "3.10"
python_id: cp310
platform_id: manylinux_x86_64
- os: ubuntu-22.04
python: "3.11"
python_id: cp311
platform_id: manylinux_x86_64
- os: ubuntu-22.04
python: "3.12"
python_id: cp312
platform_id: manylinux_x86_64
# 🐧 manylinux aarch64
- os: ubicloud-standard-2-arm
python: "3.9"
python_id: cp39
platform_id: manylinux_aarch64
- os: ubicloud-standard-2-arm
python: "3.10"
python_id: cp310
platform_id: manylinux_aarch64
- os: ubicloud-standard-2-arm
python: "3.11"
python_id: cp311
platform_id: manylinux_aarch64
- os: ubicloud-standard-2-arm
python: "3.12"
python_id: cp312
platform_id: manylinux_aarch64
# 🐧 manylinux2014 PyPy x86_64
- os: ubuntu-22.04
python: "3.9"
python_id: pp39
platform_id: manylinux_x86_64
- os: ubuntu-22.04
python: "3.10"
python_id: pp310
platform_id: manylinux_x86_64
# 🐧 manylinux2014 PyPy ARM
- os: ubicloud-standard-2-arm
python: "3.9"
python_id: pp39
platform_id: manylinux_aarch64
- os: ubicloud-standard-2-arm
python: "3.10"
python_id: pp310
platform_id: manylinux_aarch64
# 🦀 musllinux x86_64
- os: ubuntu-22.04
python: "3.9"
python_id: cp39
platform_id: musllinux_x86_64
- os: ubuntu-22.04
python: "3.10"
python_id: cp310
platform_id: musllinux_x86_64
- os: ubuntu-22.04
python: "3.11"
python_id: cp311
platform_id: musllinux_x86_64
- os: ubuntu-22.04
python: "3.12"
python_id: cp312
platform_id: musllinux_x86_64
# 🦀 musllinux ARM
- os: ubicloud-standard-2-arm
python: "3.9"
python_id: cp39
platform_id: musllinux_aarch64
- os: ubicloud-standard-2-arm
python: "3.10"
python_id: cp310
platform_id: musllinux_aarch64
- os: ubicloud-standard-2-arm
python: "3.11"
python_id: cp311
platform_id: musllinux_aarch64
- os: ubicloud-standard-2-arm
python: "3.12"
python_id: cp312
platform_id: musllinux_aarch64
# 🍎 macOS x86_64
- os: macos-12-xl
python: "3.9"
python_id: cp39
platform_id: macosx_x86_64
- os: macos-12-xl
python: "3.10"
python_id: cp310
platform_id: macosx_x86_64
- os: macos-12-xl
python: "3.11"
python_id: cp311
platform_id: macosx_x86_64
- os: macos-12-xl
python: "3.12"
python_id: cp312
platform_id: macosx_x86_64
# 🍎 macOS arm64 (Apple silicon)
# XXX: ☠️ https://github.com/actions/setup-python/issues/696
# - os: flyci-macos-large-latest-m1
# python: "3.9"
# python_id: cp39
# platform_id: macosx_arm64
- os: flyci-macos-large-latest-m1
python: "3.10"
python_id: cp310
platform_id: macosx_arm64
- os: flyci-macos-large-latest-m1
python: "3.11"
python_id: cp311
platform_id: macosx_arm64
- os: flyci-macos-large-latest-m1
python: "3.12"
python_id: cp312
platform_id: macosx_arm64
steps:
- name: Checkout python-hyperscan
uses: actions/checkout@v4
with:
fetch-depth: 0
# XXX: ☠️ https://github.com/actions/setup-python/issues/108
- if: ${{ !endsWith(matrix.os, '-arm') }}
uses: pdm-project/setup-pdm@v4
with:
python-version: ${{ matrix.python }}
cache: true
# XXX: deadsnakes does not provide Python 3.10 for ubuntu 20.04 (jammy)
# as it's already the default upstream version; so we only need to use
# it for other versions, and only on ARM.
- if: ${{ endsWith(matrix.os, '-arm') && !endsWith(matrix.python_id, '310') }}
uses: deadsnakes/[email protected]
with:
python-version: ${{ matrix.python }}
- if: ${{ endsWith(matrix.os, '-arm') }}
name: Install PDM
run: |
curl -sSL https://pdm-project.org/install-pdm.py | python3 -
- name: Install Python deps
run: |
pdm install -G build -G release --no-self --no-lock -v
- name: Increment version
id: semantic-version
run: |
echo "version=$(pdm run semantic-release version --no-commit 2>/dev/null)" >> "$GITHUB_OUTPUT"
- name: Setup macOS environment
if: contains(matrix.os, 'macos')
run: |
gid=$(id -g)
uid=$(id -u)
sudo mkdir -p /opt/vectorscan /opt/pcre
sudo chown -R $uid:$gid /opt/vectorscan /opt/pcre
- name: Restore build dependencies cache
if: contains(matrix.os, 'macos')
uses: actions/cache/restore@v4
with:
key: ${{ needs.build_environment.outputs.build-deps-cache-key }}
path: |
/opt/vectorscan
/opt/pcre
- name: Restore build artifacts cache
id: cache-wheels
uses: actions/cache/restore@v4
with:
key: ${{ runner.os }}-${{ matrix.python_id }}-${{ matrix.platform_id }}-${{ steps.semantic-version.outputs.version }}-${{ hashFiles('./src', './build_tools/**/build_*.sh') }}
path: |
wheelhouse/*.whl
- name: Build and test wheels
if: steps.cache-wheels.outputs.cache-hit != 'true'
env:
PCRE_VERSION: ${{env.PCRE_VERSION}}
CIBW_ARCHS_MACOS: ${{ matrix.platform_id == 'macosx_arm64' && 'arm64' || 'x86_64' }}
CIBW_ARCHS_LINUX: auto aarch64
CIBW_BUILD: ${{ matrix.python_id }}-${{ matrix.platform_id }}
CIBW_BUILD_VERBOSITY: 1
run: bash ./build_tools/wheels/build_wheels.sh
- name: Save build artifacts
uses: actions/cache/save@v4
if: steps.cache-wheels.outputs.cache-hit != 'true'
with:
key: ${{ steps.cache-wheels.outputs.cache-primary-key }}
path: |
wheelhouse/*.whl
- name: Upload wheels to artifacts
uses: actions/upload-artifact@v4
if: github.event_name == 'workflow_dispatch' || steps.cache-wheels.outputs.cache-hit != 'true'
with:
name: wheel-${{ matrix.python_id }}-${{ matrix.platform_id }}
path: |
wheelhouse/*.whl
build_sdist:
name: Source distribution
runs-on: ubuntu-22.04
steps:
- name: Restore source distribution cache
id: cache-sdist
uses: actions/cache/restore@v4
with:
key: sdist-${{ hashFiles('./src', './README.md', 'LICENSE', '*.py') }}
path: |
dist/*.tar.gz
- name: Checkout python-hyperscan
uses: actions/checkout@v4
with:
fetch-depth: 0
if: steps.cache-sdist.outputs.cache-hit != 'true'
- uses: pdm-project/setup-pdm@v4
with:
python-version: "3.11"
cache: true
if: steps.cache-sdist.outputs.cache-hit != 'true'
- name: Install Python deps
run: |
pdm install -G build -G release --no-self --no-lock -v
if: steps.cache-sdist.outputs.cache-hit != 'true'
- name: Increment version
run: pdm run semantic-release version --no-commit
if: steps.cache-sdist.outputs.cache-hit != 'true'
- name: Build source distribution
run: |
python setup.py sdist
if: steps.cache-sdist.outputs.cache-hit != 'true'
- name: Save source distribution cache
uses: actions/cache/save@v4
with:
key: ${{ steps.cache-sdist.outputs.cache-primary-key }}
path: |
dist/*.tar.gz
if: steps.cache-sdist.outputs.cache-hit != 'true'
- name: Upload source distribution to artifacts
uses: actions/upload-artifact@v4
if: github.event_name == 'workflow_dispatch' || steps.cache-sdist.outputs.cache-hit != 'true'
with:
name: sdist
path: |
dist/*.tar.gz
release:
name: Publish package
runs-on: ubuntu-22.04
concurrency: release
if: github.repository == 'darvid/python-hyperscan'
needs: [build_wheels, build_sdist]
permissions:
id-token: write
pull-requests: write
contents: write
env:
RELEASE_PR_BRANCH: create-pull-request/patch
steps:
- name: Checkout python-hyperscan
uses: actions/checkout@v4
with:
ref: main
fetch-depth: 0
- uses: chainguard-dev/actions/setup-gitsign@main
- name: Check if release needed
id: release
uses: python-semantic-release/[email protected]
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
root_options: "-vv --noop"
# python-semantic-release displays what it would have
# committed if commit is true and noop is set
commit: "true"
- name: Download artifacts
uses: actions/download-artifact@v4
if: github.event_name == 'workflow_dispatch' || steps.release.outputs.released == 'true'
- name: Prepare dist
if: github.event_name == 'workflow_dispatch' || steps.release.outputs.released == 'true'
run: |
mkdir dist
mv --backup=numbered ./wheel-*/*.whl -t dist/
mv --backup=numbered ./sdist/*.tar.gz -t dist/
ls -ahl dist/
rm -rf dist/*~
- name: Create release branch
if: steps.release.outputs.released == 'true'
run: |
# use the same default branch name that create-pull-request uses
git checkout -b ${RELEASE_PR_BRANCH}
git branch --set-upstream-to=${RELEASE_PR_BRANCH}
- name: Semantic release
uses: python-semantic-release/[email protected]
if: steps.release.outputs.released == 'true'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
root_options: "-vv"
- name: Create PR
uses: peter-evans/[email protected]
if: steps.release.outputs.released == 'true'
with:
base: main
assignees: ${{ github.repository_owner }}
title: "Release ${{ steps.release.outputs.version }}"
- name: Publish package distributions to GitHub Releases
if: github.event_name == 'workflow_dispatch' || steps.release.outputs.released == 'true'
uses: python-semantic-release/upload-to-gh-release@main
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ steps.release.outputs.tag }}
- name: Publish package distributions to PyPI
if: github.event_name == 'workflow_dispatch' || steps.release.outputs.released == 'true'
uses: pypa/gh-action-pypi-publish@release/v1
with:
skip-existing: true
verbose: true