Skip to content

Commit

Permalink
feat(ci): refactor actions and add linting
Browse files Browse the repository at this point in the history
- refactor: revise testing into unified integration pipeline
- refactor: create re-usable setup-env action
- feat: add pipeline support for poetry dynamic versioning
- feat: add actionlint to pre-commit hooks.
  • Loading branch information
kenibrewer committed Oct 28, 2023
1 parent 8483796 commit c57d921
Show file tree
Hide file tree
Showing 9 changed files with 237 additions and 174 deletions.
81 changes: 81 additions & 0 deletions .github/actions/setup-env/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Setup Environment and Cache
description: |
A reusable composite action to setup the environment for a job.
This action will:
- Setup Python
- Cache the pre-commit installation
- Cache the virtual environment
- Setup poetry
- Install dependencies
inputs:
python-version:
description: The version of Python to use (passed to actions/setup-python)
required: true
cache-pre-commit:
description: Whether to cache the pre-commit installation
required: false
default: "true"
cache-venv:
description: Whether to cache the virtual environment
required: false
default: "true"
setup-poetry:
description: Whether to setup poetry
required: false
default: "true"
install-deps:
description: Whether to install dependencies
required: false
default: "true"
runs:
using: "composite"
steps:
- name: Set up Python ${{ inputs.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ inputs.python-version }}
- name: Generate Cache Key PY
# The cache key PY is a hash of the Python version and the
# output of `pip freeze` (the installed packages).
# This ensures that the cache is invalidated when the Python
# version or the default packages change. Both of the remaining
# cache keys depend on PY.
shell: bash
run: echo "PY=$((python -VV; pip freeze) | sha256sum | cut -d' ' -f1)" >>
$GITHUB_ENV
- name: Cache pre-commit installation
# The cache key for the pre-commit installation is a hash of the
# operating system, PY (see above), and the pre-commit config.
# This allows for caching the pre-commit hook installation across
# jobs and workflows.
if: ${{ inputs.cache-pre-commit == 'true' }}
uses: actions/cache@v3
with:
path: |
.cache
pre-commit
key: cache|${{ runner.os }}|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
- name: Cache venv
# The cache key for the virtual environment is a hash of the
# operating system, PY (see above), the pyproject.toml and
# the poetry.lock file. This allows for caching the virtual
# environment with all the dependencies.
if: ${{ inputs.cache-venv == 'true' }}
uses: actions/cache@v3
with:
path: |
.cache
.venv
key:
cache|${{ runner.os }}|${{ env.PY }}|${{ hashFiles('pyproject.toml') }}|${{
hashFiles('poetry.lock') }}
- name: Setup poetry and poetry-dynamic-versioning
shell: bash
if: ${{ inputs.setup-poetry == 'true' }}
run: |
python -m pip install poetry poetry-dynamic-versioning
- name: Install dependencies with poetry
shell: bash
if: ${{ inputs.install-deps == 'true' }}
run: |
poetry install --with dev,docs --all-extras -v --no-interaction
66 changes: 0 additions & 66 deletions .github/workflows/codecov.yml

This file was deleted.

106 changes: 106 additions & 0 deletions .github/workflows/integration-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
name: Integration Workflow

on:
pull_request:
push:
branches: [main]
tags: ["*"]
workflow_dispatch:
inputs:
pytest_addopts:
description: Extra options for pytest; use -vv for full details; see
https://docs.pytest.org/en/latest/example/simple.html#how-to-change-command-line-options-defaults
required: false
default: ""

env:
LANG: "en_US.utf-8"
LC_ALL: "en_US.utf-8"
PIP_CACHE_DIR: ${{ github.workspace }}/.cache/pip
POETRY_CACHE_DIR: ${{ github.workspace }}/.cache/pypoetry
POETRY_VIRTUALENVS_IN_PROJECT: "true"
PRE_COMMIT_HOME: ${{ github.workspace }}/.cache/pre-commit
PYTEST_ADDOPTS: ${{ github.event.inputs.pytest_addopts }}
PYTHONIOENCODING: "UTF-8"
TARGET_PYTHON_VERSION: "3.9"

jobs:
quality-test:
# This job is used to run pre-commit checks to ensure that all files are
# are formatted correctly.
name: Pre-commit checks
# Runs pre-commit checks on all files
# This job doesn't fail fast to ensure that feedback on function is still provided
strategy:
fail-fast: false
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
# Full history likely required for planned commitizen checks
# See #345
fetch-depth: 0
- name: Setup python, and check pre-commit cache
uses: ./.github/actions/setup-env
with:
python-version: ${{ env.TARGET_PYTHON_VERSION }}
cache-pre-commit: true
cache-venv: false
setup-poetry: false
- name: Run pre-commit checks on all files
uses: pre-commit/[email protected]
with:
extra_args: --all-files
integration-test:
name: Pytest (Python ${{ matrix.python-version }} on ${{ matrix.os }})
# Runs pytest on all tested versions of python and OSes
strategy:
fail-fast: false
matrix:
os:
- macos-latest
- ubuntu-latest
python-version: ["3.8", "3.9", "3.10", "3.11"]
runs-on: ${{ matrix.os }}
env:
OS: ${{ matrix.os }}
# This is needed to avoid a warning from SQLAlchemy
# https://sqlalche.me/e/b8d9
# We can remove this once we upgrade to SQLAlchemy >= 2.0
SQLALCHEMY_SILENCE_UBER_WARNING: "1"
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Setup python, and load cache
uses: ./.github/actions/setup-env
with:
python-version: ${{ matrix.python-version }}
cache-pre-commit: false
cache-venv: true
setup-poetry: true
install-deps: true
- name: Run pytest and generate coverage report
# For the target version and ubuntu, run pytest and generate coverage report
if: (matrix.os == 'ubuntu-latest') && (matrix.python-version == env.TARGET_PYTHON_VERSION)
run: poetry run pytest --cov=./ --cov-report=xml ${{ github.event.inputs.pytest_addopts }}
- name: Upload coverage to Codecov
# For the target version and ubuntu, upload coverage to Codecov
continue-on-error: true
if: (matrix.os == 'ubuntu-latest') && (matrix.python-version == env.TARGET_PYTHON_VERSION )
uses: codecov/codecov-action@v3
env:
OS: ${{ matrix.os }}
PYTHON: ${{ matrix.python-version }}
with:
file: ./coverage.xml
files: ./coverage1.xml,./coverage2.xml
directory: ./coverage/reports/
env_vars: OS,PYTHON
fail_ci_if_error: true
flags: unittests
name: pycytominer
- name: Run pytest
# For every other version and/or OS, run pytest without coverage
if: (matrix.os != 'ubuntu-latest') || (matrix.python-version != env.TARGET_PYTHON_VERSION )
run: poetry run pytest ${{ github.event.inputs.pytest_addopts }}
22 changes: 0 additions & 22 deletions .github/workflows/pre-commit-ci.yml

This file was deleted.

20 changes: 0 additions & 20 deletions .github/workflows/publish-to-pypi.yml

This file was deleted.

45 changes: 45 additions & 0 deletions .github/workflows/pypi-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Publish Python 🐍 distributions 📦 to PyPI and TestPyPI
on: [release]

env:
LANG: "en_US.utf-8"
LC_ALL: "en_US.utf-8"
PYTHONIOENCODING: "UTF-8"
TARGET_PYTHON_VERSION: "3.9"

jobs:
build-and-publish:
name: Build and publish Python 🐍 distributions
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
# We do not need to fetch all the history of the repository
# as commit being released is guaranteed to have a tag.
# poetry-dynamic-versioning will use that tag use to set the
# build version of the package.
fetch-depth: 1
- name: Setup base environment
uses: ./.github/actions/setup-env
with:
python-version: ${{ env.TARGET_PYTHON_VERSION }}
cache-pre-commit: false
cache-venv: false
setup-poetry: true
install-deps: false
- name: Build 📦 distributions
run: |
poetry build
- name: Publish any distribution 📦 to Test PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
repository-url: https://test.pypi.org/legacy/
password: ${{ secrets.TEST_PYPI_API_TOKEN }}
- name: Publish tagged distribution 📦 to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
if: startsWith(github.ref, 'refs/tags')
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
Loading

0 comments on commit c57d921

Please sign in to comment.