ci: Use uv
instead of pyenv
to control lock files
#1216
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: backend | |
on: | |
pull_request: | |
paths: | |
- '.github/workflows/backend.yml' | |
- 'skore/**' | |
push: | |
branches: | |
- main | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref }} | |
cancel-in-progress: true | |
permissions: | |
contents: read | |
defaults: | |
run: | |
shell: "bash" | |
jobs: | |
backend-lint: | |
runs-on: "ubuntu-latest" | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.12" | |
cache: pip | |
- name: Install dependencies | |
run: python -m pip install --upgrade pip pre-commit | |
- name: Lint | |
working-directory: skore/ | |
run: | | |
pre-commit run --all-files ruff | |
pre-commit run --all-files mypy | |
backend-lockfiles: | |
runs-on: "ubuntu-latest" | |
if: ${{ github.event_name == 'pull_request' }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 2 | |
- name: Check lockfiles are not obsolete | |
run: | | |
changes=$(git diff --name-only HEAD^1 HEAD) | |
if | |
(echo "${changes}" | grep -qE 'skore/(test-)?requirements.in') && | |
(echo "${changes}" | (! grep -qE "skore/ci/requirements/.*/test-requirements.txt")) | |
then | |
echo '::error title=backend-lockfiles:: Lockfiles obsolete, please execute `$ cd skore/ci; bash pip-compile.sh`' | |
exit 1 | |
fi | |
backend-test: | |
strategy: | |
fail-fast: false | |
matrix: | |
os: ["ubuntu-latest", "windows-latest"] | |
python: ["3.9", "3.10", "3.11", "3.12"] | |
scikit-learn: ["1.6"] | |
include: | |
- os: "ubuntu-latest" | |
python: "3.12" | |
scikit-learn: "1.4" | |
- os: "ubuntu-latest" | |
python: "3.12" | |
scikit-learn: "1.5" | |
- os: "ubuntu-latest" | |
python: "3.12" | |
scikit-learn: "1.6" | |
coverage: true | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
id: setup-python | |
with: | |
python-version: ${{ matrix.python }} | |
check-latest: True | |
cache: pip | |
- name: Restore python-venv | |
uses: actions/cache/restore@v4 | |
id: cache-python-venv | |
with: | |
path: 'skore/venv' | |
key: >- | |
python-venv | |
-${{ matrix.os }} | |
-${{ steps.setup-python.outputs.python-version }} | |
-${{ hashFiles(format('skore/ci/requirements/python-{0}/scikit-learn-{1}/test-requirements.txt', matrix.python, matrix.scikit-learn)) }} | |
- name: Setup python-venv | |
working-directory: "skore/" | |
run: | | |
set -eu | |
# Ensure venv is created | |
python -m venv venv | |
# Activate venv for each step depending on the OS | |
if [[ "${{ matrix.os }}" == "ubuntu-latest" ]]; then | |
echo "${GITHUB_WORKSPACE}/skore/venv/bin" >> ${GITHUB_PATH} | |
echo "VIRTUAL_ENV=${GITHUB_WORKSPACE}/skore/venv" >> ${GITHUB_ENV} | |
else | |
echo "${GITHUB_WORKSPACE}\\skore\\venv\\Scripts" >> ${GITHUB_PATH} | |
echo "VIRTUAL_ENV=${GITHUB_WORKSPACE}\\skore\\venv" >> ${GITHUB_ENV} | |
fi | |
- name: Install dependencies in python-venv | |
working-directory: ${{ format('skore/ci/requirements/python-{0}/scikit-learn-{1}', matrix.python, matrix.scikit-learn) }} | |
if: steps.cache-python-venv.outputs.cache-hit != 'true' | |
run: | | |
python -m pip install --upgrade pip build | |
python -m pip install --requirement test-requirements.txt | |
- name: Save python-venv | |
uses: actions/cache/save@v4 | |
if: steps.cache-python-venv.outputs.cache-hit != 'true' | |
with: | |
path: 'skore/venv' | |
key: ${{ steps.cache-python-venv.outputs.cache-primary-key }} | |
- name: Build | |
working-directory: skore/ | |
run: python -m build | |
- name: Install | |
working-directory: skore/dist/ | |
run: wheel=(*.whl); python -m pip install --force-reinstall --no-deps "${wheel}" | |
- name: Show dependencies versions | |
working-directory: skore/ | |
run: | | |
python -c "import skore; skore.show_versions()" | |
- name: Test without coverage | |
if: ${{ ! matrix.coverage }} | |
timeout-minutes: 10 | |
working-directory: skore/ | |
run: python -m pytest -n auto src/ tests/ --no-cov | |
- name: Test with coverage | |
if: ${{ matrix.coverage }} | |
timeout-minutes: 10 | |
working-directory: skore/ | |
run: | | |
mkdir coverage | |
python -m pytest -n auto src/ tests/ --junitxml=coverage/coverage.xml --cov-config=pyproject.toml --cov | tee coverage/coverage.txt | |
- name: Upload coverage reports | |
if: ${{ matrix.coverage && (github.event_name == 'pull_request') }} | |
uses: actions/upload-artifact@v4 | |
with: | |
name: backend-coverage | |
path: skore/coverage/ |