Skip to content

feat: Setup release process #118

feat: Setup release process

feat: Setup release process #118

Workflow file for this run

# This file was initially generated by maturin v1.2.0, using:
#
# maturin generate-ci github --pytest -o ../.github/workflows/ci_python.yml
#
# TODO:
# - `safety`
# - `typeguard`
# - `xdoctest`
#
# Currently, `mypy` and `pytest` are running as part of building the rules.
# We could (in theory) use a matrix to do these in parallel fetching the
# built wheels, but it doesn't seem likely to provide a significant speedup.
name: CI
# Only one job per-ref
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
on:
push:
branches:
- main
tags:
- '*'
pull_request:
branches:
- main
merge_group:
branches:
- main
release:
types:
- published
defaults:
run:
shell: bash
working-directory: python
permissions:
contents: read
jobs:
# Run lint separately from the build -- it doesn't need the built Rust code.
#
# Also, only do it on one machine.
lint:
if: github.event_name == 'pull_request' || github.event_name == 'merge_group'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install poetry
run: |
pipx install poetry
poetry config virtualenvs.create true --local
poetry config virtualenvs.in-project true --local
- uses: actions/setup-python@v4
with:
python-version: 3.11
cache: poetry
- name: install deps
run: |
poetry install --only=main --only=lint
- name: black
run: |
poetry run black --diff pysrc pytests docs/source
- name: flake8
run: |
poetry run flake8 pysrc pytests docs/source
- name: isort
run: |
poetry run isort --filter-files --diff pysrc pytests docs/source
- name: darglint
run: |
poetry run darglint pysrc
- name: pydocstyle
run: |
poetry run pydocstyle pysrc
debug:
if: |
github.event_name == 'pull_request' ||
github.event_name == 'merge_group' ||
(github.event_name == 'push' && github.ref == 'refs/heads/main')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install poetry
run: |
pipx install poetry
poetry config virtualenvs.create true --local
poetry config virtualenvs.in-project true --local
- uses: actions/setup-python@v4
with:
python-version: |
3.8
3.9
3.10
3.11
cache: poetry
- name: Build debug wheels
uses: messense/maturin-action@v1
with:
target: x86_64
manylinux: 2_28
args: --out dist --profile dev
working-directory: python
before-script-linux: |
set -e
dnf -y install clang protobuf-devel lld
clang --version
protoc --version
- name: pytest and mypy
run: |
for V in 3.8 3.9 3.10 3.11; do
echo "::group::Install for Python $V"
poetry env use $V
poetry env info
source $(poetry env info --path)/bin/activate
poetry install --only=test --only=typecheck
pip install 'kaskada[plot]>=0.6.0-a.0' --find-links dist --force-reinstall
echo "::endgroup::"
echo "::group::Test Python $V"
poetry run pytest
echo "::endgroup::"
echo "::group::MyPy Python $V"
poetry run mypy -- --install-types --non-interactive pysrc pytests
echo "::endgroup::"
deactivate
done
- name: Build docs
run: |
poetry env use 3.11
source $(poetry env info --path)/bin/activate
poetry install --with=docs
ls docs/source/_static
sphinx-build docs/source docs/_build -j auto -W
deactivate
- name: Upload docs
uses: actions/upload-pages-artifact@v2
with:
# Automatically uploads an artifact from the './_site' directory by default
path: ${{ github.workspace }}/python/docs/_build
version:
# Build wheels in the merge queue (to verify they build) and during release.
if: |
github.event_name == 'merge_group' ||
github.event_name == 'release'
runs-on: ubuntu-latest
outputs:
version: ${{ steps.set-version.outputs.version }}
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: 3.11
- name: Determine version (merge)
run: |
pip install tomlkit
VERSION=$(python ../scripts/get_version.py path_to_toml_file.toml path.within.toml)
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Determine version (release)
run: |
VERSION=${GITHUB_REF#refs/tags/v}
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Set version
id: set-version
run: |
echo VERSION=$VERSION
echo "::set-output name=version::$VERSION"
build-wheel-macos:
# Build wheels in the merge queue (to verify they build) and during release.
if: |
github.event_name == 'merge_group' ||
github.event_name == 'release'
runs-on: macos-latest
needs: [version]
strategy:
matrix:
include:
- target: x86_64
- target: universal2
steps:
- uses: actions/checkout@v3
- name: Install poetry
run: |
pipx install poetry
poetry config virtualenvs.create true --local
poetry config virtualenvs.in-project true --local
- uses: actions/setup-python@v4
with:
python-version: |
3.8
3.9
3.10
3.11
architecture: x64
cache: poetry
- name: Install Protoc
uses: arduino/setup-protoc@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Set Version (For Release)
if: github.event_name == 'release'
run: |
pip install tomlkit
python ../scripts/set_versions.py ${{ needs.version.outputs.version }} \
pyproject.toml:project.version \
pyproject.toml:tool.poetry.version \
Cargo.toml:workspace.package.version
- name: Build wheel
uses: messense/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist --sdist
working-directory: python
- name: pytest and mypy
run: |
for V in 3.8 3.9 3.10 3.11; do
echo "::group::Install for Python $V"
poetry env use $V
source $(poetry env info --path)/bin/activate
poetry install --only=test --only=typecheck
pip install 'kaskada[plot]>=0.6.0-a.0' --find-links dist --force-reinstall
echo "::endgroup::"
echo "::group::Test Python $V"
poetry run pytest
echo "::endgroup::"
echo "::group::MyPy Python $V"
poetry run mypy -- --install-types --non-interactive pysrc pytests
echo "::endgroup::"
deactivate
done
- name: Upload wheels
uses: actions/upload-artifact@v2
with:
name: wheels
path: ${{ github.workspace }}/python/dist
build-wheel-windows:
# Build wheels in the merge queue (to verify they build) and during release.
if: |
github.event_name == 'merge_group' ||
github.event_name == 'release'
needs: [version]
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Install poetry
run: |
pipx install poetry
poetry config virtualenvs.create true --local
poetry config virtualenvs.in-project true --local
- uses: actions/setup-python@v4
with:
python-version: 3.11
architecture: x64
cache: poetry
- name: Install Protoc
uses: arduino/setup-protoc@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Set Version (For Release)
if: github.event_name == 'release'
run: |
pip install tomlkit
python ../scripts/set_versions.py ${{ needs.version.outputs.version }} \
pyproject.toml:project.version \
pyproject.toml:tool.poetry.version \
Cargo.toml:workspace.package.version
- name: Build wheels
uses: messense/maturin-action@v1
with:
target: x64
args: --release --out dist
working-directory: python
- name: pytest and mypy (Windows x64)
shell: bash
run: |
echo "::group::Install for Python 3.11"
source $(poetry env info --path)\\Scripts\\activate
poetry install --only=test --only=typecheck
pip install 'kaskada[plot]>=0.6.0-a.0' --find-links dist --force-reinstall
echo "::endgroup::"
echo "::group::Test Python 3.11"
poetry run pytest
echo "::endgroup::"
echo "::group::MyPy Python 3.11"
poetry run mypy -- --install-types --non-interactive pysrc pytests
echo "::endgroup::"
deactivate
- name: Upload wheels
uses: actions/upload-artifact@v2
with:
name: wheels
path: ${{ github.workspace }}/python/dist
build-wheel-linux:
# Build wheels in the merge queue (to verify they build) and during release.
if: |
github.event_name == 'merge_group' ||
github.event_name == 'release'
needs: [version]
runs-on: ubuntu-latest
strategy:
matrix:
include:
- target: x86_64
steps:
- uses: actions/checkout@v3
- name: Install poetry
run: |
pipx install poetry
poetry config virtualenvs.create true --local
poetry config virtualenvs.in-project true --local
- uses: actions/setup-python@v4
with:
python-version: |
3.8
3.9
3.10
3.11
cache: poetry
- name: Set Version (For Release)
if: github.event_name == 'release'
run: |
pip install tomlkit
python ../scripts/set_versions.py ${{ needs.version.outputs.version }} \
pyproject.toml:project.version \
pyproject.toml:tool.poetry.version \
Cargo.toml:workspace.package.version
- name: Build wheels
uses: messense/maturin-action@v1
with:
target: ${{ matrix.target }}
manylinux: 2_28
args: --release --out dist
working-directory: python
before-script-linux: |
set -e
dnf -y install clang protobuf-devel lld
clang --version
protoc --version
- name: pytest and mypy (Linux x86_64)
if: matrix.target == 'x86_64'
run: |
for V in 3.8 3.9 3.10 3.11; do
echo "::group::Install for Python $V"
poetry env use $V
poetry env info
source $(poetry env info --path)/bin/activate
poetry install --only=test --only=typecheck
pip install 'kaskada[plot]>=0.6.0-a.0' --find-links dist --force-reinstall
echo "::endgroup::"
echo "::group::Test Python $V"
poetry run pytest
echo "::endgroup::"
echo "::group::MyPy Python $V"
poetry run mypy -- --install-types --non-interactive pysrc pytests
echo "::endgroup::"
deactivate
done
- name: Upload wheels
uses: actions/upload-artifact@v2
with:
name: wheels
path: ${{ github.workspace }}/python/dist
# Make the source distribution
sdist:
# Build wheels in the merge queue (to verify they build) and during release.
if: |
github.event_name == 'merge_group' ||
github.event_name == 'release'
needs: [version]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set Version (For Release)
if: github.event_name == 'release'
run: |
pip install tomlkit
python ../scripts/set_versions.py ${{ needs.version.outputs.version }} \
pyproject.toml:project.version \
pyproject.toml:tool.poetry.version \
Cargo.toml:workspace.package.version
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
command: sdist
args: --out dist
working-directory: python
- name: Upload sdist
uses: actions/upload-artifact@v3
with:
name: wheels
path: ${{ github.workspace }}/python/dist
docs-deploy:
# Deploy docs on push to main.
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
# Deployment job
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
# Grant GITHUB_TOKEN the permissions required to make a Pages deployment
permissions:
pages: write # to deploy to Pages
id-token: write # to verify the deployment originates from an appropriate source
runs-on: ubuntu-latest
needs: [debug]
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v2
release:
name: Release
runs-on: ubuntu-latest
environment: pypi
needs: [build-wheel-linux, build-wheel-windows, build-wheel-macos, sdist]
permissions:
id-token: write
if: github.event_name == 'release' && github.event.action == 'published'
steps:
- uses: actions/download-artifact@v3
with:
# unpacks default artifact into dist/
# if `name: artifact` is omitted, the action will create extra parent dir
name: artifact
path: dist
# - uses: pypa/gh-action-pypi-publish@release/v1
# To Test
#with:
# To test: repository_url: https://test.pypi.org/legacy/