Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update the release process to leverage GitHub Actions #37

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
129 changes: 129 additions & 0 deletions .github/workflows/publish_pybedlite.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
name: publish pybedlite

on:
push:
tags: '\d+.\d+.\d+'

env:
POETRY_VERSION: 1.6

jobs:
on-main-branch-check:
runs-on: ubuntu-latest
outputs:
on_main: ${{ steps.contains_tag.outputs.retval }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- uses: rickstaa/action-contains-tag@v1
id: contains_tag
with:
reference: "main"
tag: "${{ github.ref_name }}"

tests:
name: tests
needs: on-main-branch-check
if: ${{ needs.on-main-branch-check.outputs.on_main == 'true' }}
uses: "./.github/workflows/tests.yml"

build-wheels:
name: build wheels
needs: tests
uses: "./.github/workflows/wheels.yml"

build-sdist:
name: build source distribution
needs: tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: true

- uses: actions/setup-python@v5
with:
python-version: 3.12

- name: Install poetry
run: |
python -m pip install --upgrade pip
python -m pip install poetry==${{env.POETRY_VERSION}}

- name: Configure poetry
shell: bash
run: poetry config virtualenvs.in-project true

- name: Install dependencies
run: poetry install --no-interaction --no-root --without=dev

- name: Install project
run: poetry install --no-interaction --without=dev

- name: Build package
run: poetry build --format=sdist

- uses: actions/upload-artifact@v4
with:
name: pybedlite-sdist
path: dist/*.tar.gz

publish-to-pypi:
runs-on: ubuntu-latest
needs: [build-wheels, build-sdist]
environment: pypi
permissions:
id-token: write
steps:
- uses: actions/download-artifact@v4
with:
path: packages
pattern: 'pybedlite-*'
merge-multiple: true

- uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: packages/
skip-existing: true
verbose: true

make-changelog:
runs-on: ubuntu-latest
needs: publish-to-pypi
outputs:
release_body: ${{ steps.git-cliff.outputs.content }}
steps:
- name: Checkout the Repository at the Tagged Commit
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.ref_name }}

- name: Generate a Changelog
uses: orhun/git-cliff-action@v3
id: git-cliff
with:
config: pyproject.toml
args: --latest --verbose
env:
GITHUB_REPO: ${{ github.repository }}

make-github-release:
runs-on: ubuntu-latest
environment: github
permissions:
contents: write
pull-requests: read
needs: make-changelog
steps:
- name: Create Draft Release
id: create_release
uses: softprops/action-gh-release@v2
with:
name: ${{ github.ref_name }}
body: ${{ needs.make-changelog.outputs.release_body }}
draft: false
prerelease: false
93 changes: 0 additions & 93 deletions .github/workflows/pythonpackage.yml

This file was deleted.

103 changes: 103 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
name: tests

on:
push:
branches:
- "**"
tags:
- "!**"
workflow_call:

env:
POETRY_VERSION: 1.6

jobs:
unit-tests:
runs-on: ubuntu-latest
strategy:
matrix:
PYTHON_VERSION: ["3.8", "3.9", "3.10", "3.11", "3.12"]

steps:
- uses: actions/checkout@v4
with:
submodules: "true"

- name: Set up Python ${{ matrix.PYTHON_VERSION }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.PYTHON_VERSION }}

- name: Get full Python version
id: full-python-version
shell: bash
run: echo "version=$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))")" >> $GITHUB_OUTPUT

- name: Install poetry
run: |
python -m pip install --upgrade pip
python -m pip install poetry==${{env.POETRY_VERSION}}

- name: Configure poetry
shell: bash
run: poetry config virtualenvs.in-project true

- name: Set up cache
uses: actions/cache@v4
id: cache
with:
path: .venv
key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }}

- name: Ensure cache is healthy
if: steps.cache.outputs.cache-hit == 'true'
shell: bash
run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv

- name: Test the lock file is up to date
run: python -m poetry check --lock

- name: Install dependencies and package
shell: bash
run: |
poetry install --only dev
poetry build
poetry install --extras docs

- name: Run pytest
shell: bash
run: |
poetry run python -m pytest --cov=pybedlite --cov-report=xml --cov-branch

- name: Style checking
shell: bash
run: |
poetry run black --line-length 99 --check pybedlite

- name: Import sorting
shell: bash
run: |
poetry run isort --force-single-line-imports --profile black --check pybedlite

- name: Run lint
shell: bash
run: |
poetry run flake8 --config=ci/flake8.cfg pybedlite

- name: Run mypy
shell: bash
run: |
poetry run mypy -p pybedlite --config=ci/mypy.ini

- name: Run docs
shell: bash
run: |
set -euo pipefail
pushd docs
poetry run make html
popd

- name: Upload code coverage
uses: codecov/[email protected]
with:
token: ${{ secrets.CODECOV_TOKEN }}
29 changes: 14 additions & 15 deletions .github/workflows/wheels.yml
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
name: Build wheels for multiple platforms
name: build wheels

on:
push:
branches: [main]
pull_request:
workflow_call:
workflow_dispatch:

jobs:
build_wheels:
build-wheels:
name: Build wheels for ${{ matrix.python }}-${{ matrix.platform.target }}_${{ matrix.platform.arch }} on ${{ matrix.platform.os }}
runs-on: ${{ matrix.platform.os }}
strategy:
matrix:
python: [cp38, cp39, cp310, cp311]
python: [cp38, cp39, cp310, cp311, cp312]
platform:
- os: ubuntu-latest
target: manylinux
Expand All @@ -22,12 +22,12 @@ jobs:
# These don't work right now - they just hang while pulling the build image from quay.
# If this doesn't resolve itself, we could try to configure different images:
# https://cibuildwheel.readthedocs.io/en/stable/options/.
#- os: ubuntu-latest
# target: manylinux
# arch: aarch64
#- os: ubuntu-latest
# target: musllinux
# arch: aarch64
# - os: ubuntu-latest
# target: manylinux
# arch: aarch64
# - os: ubuntu-latest
# target: musllinux
# arch: aarch64
- os: macos-latest
target: macosx
arch: x86_64
Expand All @@ -40,8 +40,7 @@ jobs:
with:
submodules: "true"

# Used to host cibuildwheel
- uses: actions/setup-python@v4
- uses: actions/setup-python@v5
with:
python-version: 3.8

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be ${{ matrix.python }}?

Copy link
Member Author

@clintval clintval Aug 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, you really do just need a single and separate Python for building the wheels. It's OK to use 3.8 here. I think I've tried bumping it up, but you'll hit compatibility issues with cibuidwheel and a few of the other configuration in the GitHub action. At some point I'll get this up to 3.12 and fixup the rest too. You're welcome to try swapping 3.8 for 3.12 (or something else newer) here and chasing down any errors/warnings with cibuildwheel.

Expand All @@ -55,8 +54,8 @@ jobs:
CIBW_BUILD: ${{ matrix.python }}-${{ matrix.platform.target }}_${{ matrix.platform.arch }}
CIBW_BUILD_VERBOSITY: 1

- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
name: wheels
name: pybedlite-wheels-${{ matrix.python }}-${{ matrix.platform.target }}_${{ matrix.platform.arch }}
path: ./wheelhouse/*.whl
if-no-files-found: error
Loading
Loading